diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-10-10 20:32:29 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-10-10 20:32:29 +0200 |
| commit | acad3f3963d6f0b67526d91cf4683125dbbf4cb5 (patch) | |
| tree | b80b0a5057df7c0c298fe4ed0fdb50da7355087d /src | |
| parent | 1f6ce24eaaa90353789817bd7d32b89af5e5f86a (diff) | |
| download | box64-acad3f3963d6f0b67526d91cf4683125dbbf4cb5.tar.gz box64-acad3f3963d6f0b67526d91cf4683125dbbf4cb5.zip | |
[BOX32] Actually fixed dlsym on RTLD_NEXT 32bits call
Diffstat (limited to 'src')
| -rw-r--r-- | src/wrapped/wrappedlibdl.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/wrapped/wrappedlibdl.c b/src/wrapped/wrappedlibdl.c index 7d37f1e6..05655a20 100644 --- a/src/wrapped/wrappedlibdl.c +++ b/src/wrapped/wrappedlibdl.c @@ -366,7 +366,14 @@ void* my_dlsym(x64emu_t* emu, void *handle, void *symbol) } if(handle==(void*)~0LL) { // special case, look globably but no self (RTLD_NEXT) - elfheader_t *elf = FindElfAddress(my_context, *(uintptr_t*)R_RSP); // use return address to guess "self" + uintptr_t ret_addr = 0; + #ifdef BOX32 + if(box64_is32bits) + ret_addr = from_ptri(ptr_t, R_ESP); + else + #endif + ret_addr = *(uintptr_t*)R_RSP; + elfheader_t *elf = FindElfAddress(my_context, ret_addr); // use return address to guess "self" if(GetNoSelfSymbolStartEnd(my_context->maplib, rsymbol, &start, &end, elf, 0, -1, NULL, 0, NULL)) { printf_dlsym(LOG_NEVER, "%p\n", (void*)start); pthread_mutex_unlock(&mutex); |