--- a/renderdoc/os/posix/linux/linux_hook.cpp +++ b/renderdoc/os/posix/linux/linux_hook.cpp @@ -70,8 +70,10 @@ __attribute__((visibility("default"))) v void *ret = passthru(filename, flag); +#ifdef __GLIBC__ if(filename && ret && (flag & RTLD_DEEPBIND)) plthook_lib(ret); +#endif return ret; } @@ -506,8 +508,10 @@ void *intercept_dlopen(const char *filen if(filename == NULL) return ret; +#ifdef __GLIBC__ if(flag & RTLD_DEEPBIND) plthook_lib(ret); +#endif rdcstr base = get_basename(filename); --- a/renderdoc/3rdparty/plthook/plthook_elf.c +++ b/renderdoc/3rdparty/plthook/plthook_elf.c @@ -62,7 +62,7 @@ #include #include "plthook.h" -#if defined __UCLIBC__ && !defined RTLD_NOLOAD +#if !defined(__GLIBC__) && !defined(RTLD_NOLOAD) #define RTLD_NOLOAD 0 #endif @@ -204,7 +204,7 @@ static int check_elf_header(const Elf_Eh #endif static void set_errmsg(const char *fmt, ...) __attribute__((__format__ (__printf__, 1, 2))); -#if defined __ANDROID__ || defined __UCLIBC__ +#if defined(__linux__) && !defined(__GLIBC__) struct dl_iterate_data { char* addr; struct link_map lmap; @@ -249,7 +249,7 @@ int plthook_open(plthook_t **plthook_out int plthook_open_by_handle(plthook_t **plthook_out, void *hndl) { -#if defined __ANDROID__ || defined __UCLIBC__ +#if defined (__linux__) && !defined(__GLIBC__) const static char *symbols[] = { "__INIT_ARRAY__", "_end", @@ -288,7 +288,7 @@ int plthook_open_by_address(plthook_t ** { #if defined __FreeBSD__ return PLTHOOK_NOT_IMPLEMENTED; -#elif defined __ANDROID__ || defined __UCLIBC__ +#elif defined(__linux__) && !defined(__GLIBC__) struct dl_iterate_data data = {0,}; data.addr = address; dl_iterate_phdr(dl_iterate_cb, &data); @@ -312,7 +312,7 @@ int plthook_open_by_address(plthook_t ** static int plthook_open_executable(plthook_t **plthook_out) { -#if defined __ANDROID__ || defined __UCLIBC__ +#if defined(__linux__) && !defined(__GLIBC__) return plthook_open_shared_library(plthook_out, NULL); #elif defined __linux__ return plthook_open_real(plthook_out, _r_debug.r_map); @@ -351,7 +351,7 @@ static int plthook_open_executable(pltho static int plthook_open_shared_library(plthook_t **plthook_out, const char *filename) { void *hndl = dlopen(filename, RTLD_LAZY | RTLD_NOLOAD); -#if defined __ANDROID__ || defined __UCLIBC__ +#if defined(__linux__) && !defined(__GLIBC__) int rv; #else struct link_map *lmap = NULL; @@ -361,7 +361,7 @@ static int plthook_open_shared_library(p set_errmsg("dlopen error: %s", dlerror()); return PLTHOOK_FILE_NOT_FOUND; } -#if defined __ANDROID__ || defined __UCLIBC__ +#if defined(__linux__) && !defined(__GLIBC__) rv = plthook_open_by_handle(plthook_out, hndl); dlclose(hndl); return rv; @@ -553,7 +553,7 @@ static int plthook_open_real(plthook_t * #if defined __linux__ plthook.plt_addr_base = (char*)lmap->l_addr; -#if defined __ANDROID__ || defined __UCLIBC__ +#if !defined(__GLIBC__) dyn_addr_base = (const char*)lmap->l_addr; #endif #elif defined __FreeBSD__ || defined __sun