diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-01-28 22:36:21 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-01-28 22:36:21 +0100 |
| commit | 35f2bcf29686b9445627de671289a7df55c9f027 (patch) | |
| tree | d3b5cb7307bbbf6658b3a632c252c0fb8b8f3de8 /src | |
| parent | 7ebfe844892f9f4822046f98f91bfa85b3e39714 (diff) | |
| download | box64-35f2bcf29686b9445627de671289a7df55c9f027.tar.gz box64-35f2bcf29686b9445627de671289a7df55c9f027.zip | |
Fixed another regression from last lib init/fini refactor (fixed SiliconZero crash at load)
Diffstat (limited to 'src')
| -rwxr-xr-x | src/wrapped/wrappedlibdl.c | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/src/wrapped/wrappedlibdl.c b/src/wrapped/wrappedlibdl.c index 3ad6169f..f47f15ed 100755 --- a/src/wrapped/wrappedlibdl.c +++ b/src/wrapped/wrappedlibdl.c @@ -108,17 +108,15 @@ void* my_dlopen(x64emu_t* emu, void *filename, int flag) // check if alread dlopenned... for (size_t i=MIN_NLIB; i<dl->lib_sz; ++i) { if(IsSameLib(dl->libs[i], rfilename)) { - if(dl->count[i]==0 && dl->dlopened[i]) { // need to lauch init again! - if(flag&0x4) { + if(flag&0x4) { // don't re-open in RTLD_NOLOAD mode + if(dl->count[i]==0 && dl->dlopened[i]) { printf_dlsym(LOG_DEBUG, " => not present anymore\n"); return NULL; // don't re-open in RTLD_NOLOAD mode } - int idx = GetElfIndex(dl->libs[i]); - if(idx!=-1) { - printf_dlsym(LOG_DEBUG, "dlopen: Recycling, calling Init for %p (%s)\n", (void*)(i+1), rfilename); - ReloadLibrary(dl->libs[i], emu); // reset memory image, redo reloc, run inits - } + printf_dlsym(LOG_DEBUG, "dlopen: Recycling %s/%p count=%ld not inc (dlopened=%ld, elf_index=%d)\n", rfilename, (void*)(i+1), dl->count[i], dl->dlopened[i], GetElfIndex(dl->libs[i])); + return (void*)(i+1); } + IncRefCount(dl->libs[i], emu); dl->count[i] = dl->count[i]+1; printf_dlsym(LOG_DEBUG, "dlopen: Recycling %s/%p count=%ld (dlopened=%ld, elf_index=%d)\n", rfilename, (void*)(i+1), dl->count[i], dl->dlopened[i], GetElfIndex(dl->libs[i])); return (void*)(i+1); |