diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-10-13 18:50:44 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-10-13 18:50:44 +0200 |
| commit | 1e31e1fff83c7869060713ba30a29ef333133cd2 (patch) | |
| tree | 31d3bbe29913ccd5fa4c398d5576c15967b84f0a /src | |
| parent | af2a0c974770d60fdb4d1289477833883ddb7117 (diff) | |
| download | box64-1e31e1fff83c7869060713ba30a29ef333133cd2.tar.gz box64-1e31e1fff83c7869060713ba30a29ef333133cd2.zip | |
[BOX32] Fixed dlvsym for RTLD_NEXT, like dlsym
Diffstat (limited to 'src')
| -rw-r--r-- | src/wrapped/wrappedlibdl.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/src/wrapped/wrappedlibdl.c b/src/wrapped/wrappedlibdl.c index 05655a20..963e6671 100644 --- a/src/wrapped/wrappedlibdl.c +++ b/src/wrapped/wrappedlibdl.c @@ -506,6 +506,8 @@ void* my_dlvsym(x64emu_t* emu, void *handle, void *symbol, const char *vername) int version = (vername)?2:-1; uintptr_t start, end; char* rsymbol = (char*)symbol; + if(box64_is32bits && handle==(void*)0xffffffff) + handle = (void*)~0LL; CLEARERR printf_dlsym(LOG_DEBUG, "Call to dlvsym(%p, \"%s\", %s)%s", handle, rsymbol, vername?vername:"(nil)", dlsym_error?"":"\n"); if(handle==NULL) { @@ -522,7 +524,14 @@ void* my_dlvsym(x64emu_t* emu, void *handle, void *symbol, const char *vername) } 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, version, vername, 0, NULL)) { printf_dlsym(LOG_NEVER, "%p\n", (void*)start); return (void*)start; |