You've already forked ReZygisk
mirror of
https://github.com/PerformanC/ReZygisk.git
synced 2025-09-06 06:37:01 +00:00
52 lines
1.8 KiB
C++
52 lines
1.8 KiB
C++
#include <cstdio>
|
|
#include <dlfcn.h>
|
|
#include <libgen.h>
|
|
#include <climits>
|
|
#include <cstring>
|
|
#include <android/dlext.h>
|
|
|
|
#include "dl.h"
|
|
#include "logging.h"
|
|
|
|
extern "C" [[gnu::weak]] struct android_namespace_t*
|
|
//NOLINTNEXTLINE
|
|
__loader_android_create_namespace([[maybe_unused]] const char* name,
|
|
[[maybe_unused]] const char* ld_library_path,
|
|
[[maybe_unused]] const char* default_library_path,
|
|
[[maybe_unused]] uint64_t type,
|
|
[[maybe_unused]] const char* permitted_when_isolated_path,
|
|
[[maybe_unused]] android_namespace_t* parent,
|
|
[[maybe_unused]] const void* caller_addr);
|
|
|
|
void* DlopenExt(const char* path, int flags) {
|
|
auto info = android_dlextinfo{};
|
|
auto* dir = dirname(path);
|
|
auto* ns = &__loader_android_create_namespace == nullptr ? nullptr :
|
|
__loader_android_create_namespace(path, dir, nullptr,
|
|
2, /* ANDROID_NAMESPACE_TYPE_SHARED */
|
|
nullptr, nullptr,
|
|
reinterpret_cast<void*>(&DlopenExt));
|
|
if (ns) {
|
|
info.flags = ANDROID_DLEXT_USE_NAMESPACE;
|
|
info.library_namespace = ns;
|
|
|
|
LOGD("Open %s with namespace %p", path, ns);
|
|
} else {
|
|
LOGD("Cannot create namespace for %s", path);
|
|
}
|
|
|
|
auto* handle = android_dlopen_ext(path, flags, &info);
|
|
if (handle) {
|
|
LOGD("dlopen %s: %p", path, handle);
|
|
} else {
|
|
LOGE("dlopen %s: %s", path, dlerror());
|
|
}
|
|
return handle;
|
|
}
|
|
|
|
void* DlopenMem(int memfd, int flags) {
|
|
char path[PATH_MAX];
|
|
sprintf(path, "/proc/self/fd/%d", memfd);
|
|
return DlopenExt(path, flags);
|
|
}
|