about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-01-28 22:36:21 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-01-28 22:36:21 +0100
commit35f2bcf29686b9445627de671289a7df55c9f027 (patch)
treed3b5cb7307bbbf6658b3a632c252c0fb8b8f3de8 /src
parent7ebfe844892f9f4822046f98f91bfa85b3e39714 (diff)
downloadbox64-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-xsrc/wrapped/wrappedlibdl.c12
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);