blob: 0328a9966cd8f34826c675712563264090edf1b2 [file] [log] [blame]
Peter Collingbourneb39cb3c2019-03-01 13:12:49 -08001#include <android/dlext.h>
2#include <dlfcn.h>
Peter Collingbourneb39cb3c2019-03-01 13:12:49 -08003#include <stdlib.h>
Vilas Bhat8420cf02024-08-20 01:56:53 +00004#include <unistd.h>
Peter Collingbourneb39cb3c2019-03-01 13:12:49 -08005
Stephen Hines15027e02020-07-23 19:35:49 -07006extern "C" void __attribute__((section(".custom_text"))) text_before_start_of_gap() {}
7char __attribute__((section(".custom_bss"))) end_of_gap[0x1000];
Peter Collingbourneb39cb3c2019-03-01 13:12:49 -08008
9extern "C" void* get_inner() {
10 android_dlextinfo info = {};
11 info.flags = ANDROID_DLEXT_RESERVED_ADDRESS;
12
13 char* start_of_gap =
Vilas Bhat8420cf02024-08-20 01:56:53 +000014 reinterpret_cast<char*>(
15 (reinterpret_cast<uintptr_t>(text_before_start_of_gap) &
16 ~(sysconf(_SC_PAGESIZE) - 1)) + sysconf(_SC_PAGESIZE));
Peter Collingbourneb39cb3c2019-03-01 13:12:49 -080017 info.reserved_addr = start_of_gap;
18 info.reserved_size = end_of_gap - start_of_gap;
19
20 void *handle = android_dlopen_ext("libsegment_gap_inner.so", RTLD_NOW, &info);
21 if (!handle) {
22 __builtin_trap();
23 }
24
25 return dlsym(handle, "inner");
26}