about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-07-09 11:27:17 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-07-09 11:27:17 +0200
commit6eccdc1baf3d0d580afa0f66b632aa05453d3c69 (patch)
tree307803a5cad9f3485ebd7d013c5d9e3bf9bb64c0 /src
parent7aa7ef6baf7c9bb71a3b8643a38ce31036088d06 (diff)
downloadbox64-6eccdc1baf3d0d580afa0f66b632aa05453d3c69.tar.gz
box64-6eccdc1baf3d0d580afa0f66b632aa05453d3c69.zip
Added handling of flag 0x4 for wrapped dlopen
Diffstat (limited to 'src')
-rwxr-xr-xsrc/wrapped/wrappedlibdl.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/wrapped/wrappedlibdl.c b/src/wrapped/wrappedlibdl.c
index 33835292..7cb81d86 100755
--- a/src/wrapped/wrappedlibdl.c
+++ b/src/wrapped/wrappedlibdl.c
@@ -69,14 +69,19 @@ void* my_dlopen(x64emu_t* emu, void *filename, int flag)
             if(sys)
                 return sys;
         }
-        if(dlsym_error && box64_log<LOG_DEBUG) {
+        if(dlsym_error || box64_log>=LOG_DEBUG) {
             printf_log(LOG_NONE, "Call to dlopen(\"%s\"/%p, %X)\n", rfilename, filename, flag);
         }
-        printf_log(LOG_DEBUG, "Call to dlopen(\"%s\"/%p, %X)\n", rfilename, filename, flag);
         // check if alread dlopenned...
         for (size_t i=0; 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(dlsym_error || box64_log>=LOG_DEBUG) {
+                            printf_log(LOG_NONE, " => not present anymore\n");
+                        }
+                        return NULL;    // don't re-open in RTLD_NOLOAD mode
+                    }
                     int idx = GetElfIndex(dl->libs[i]);
                     if(idx!=-1) {
                         if(dlsym_error || box64_log>=LOG_DEBUG) {
@@ -85,13 +90,20 @@ void* my_dlopen(x64emu_t* emu, void *filename, int flag)
                         ReloadLibrary(dl->libs[i], emu);    // reset memory image, redo reloc, run inits
                     }
                 }
-                dl->count[i] = dl->count[i]+1;
+                if(!(flag&0x4))
+                    dl->count[i] = dl->count[i]+1;
                 if(dlsym_error || box64_log>=LOG_DEBUG) {
                         printf_log(LOG_NONE, "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);
             }
         }
+        if(flag&0x4) {   //RTLD_NOLOAD is just a "check" if lib is already loaded
+            if(dlsym_error || box64_log>=LOG_DEBUG) {
+                printf_log(LOG_NONE, " => not present\n");
+            }
+            return NULL;
+        }
         dlopened = (GetLibInternal(rfilename)==NULL);
         // Then open the lib
         const char* libs[] = {rfilename};