diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-07-09 11:27:17 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-07-09 11:27:17 +0200 |
| commit | 6eccdc1baf3d0d580afa0f66b632aa05453d3c69 (patch) | |
| tree | 307803a5cad9f3485ebd7d013c5d9e3bf9bb64c0 /src | |
| parent | 7aa7ef6baf7c9bb71a3b8643a38ce31036088d06 (diff) | |
| download | box64-6eccdc1baf3d0d580afa0f66b632aa05453d3c69.tar.gz box64-6eccdc1baf3d0d580afa0f66b632aa05453d3c69.zip | |
Added handling of flag 0x4 for wrapped dlopen
Diffstat (limited to 'src')
| -rwxr-xr-x | src/wrapped/wrappedlibdl.c | 18 |
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}; |