diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-06-15 17:14:09 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-06-15 17:14:09 +0200 |
| commit | 6e6a8f47afb855f547bb132be56f68bf27b8f096 (patch) | |
| tree | 11d17e26966a508afab640c176b300af782c49de /src | |
| parent | 7a57c70d818d168ec43e2855f627239e6931ac51 (diff) | |
| download | box64-6e6a8f47afb855f547bb132be56f68bf27b8f096.tar.gz box64-6e6a8f47afb855f547bb132be56f68bf27b8f096.zip | |
Added some speicifc workaround for libcef (staticaly linked with tcmalloc)
Diffstat (limited to 'src')
| -rwxr-xr-x | src/elfs/elfloader.c | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c index 6033981f..e6c68393 100755 --- a/src/elfs/elfloader.c +++ b/src/elfs/elfloader.c @@ -894,6 +894,22 @@ uintptr_t GetLastByte(elfheader_t* h) void AddSymbols(lib_t *maplib, kh_mapsymbols_t* mapsymbols, kh_mapsymbols_t* weaksymbols, kh_mapsymbols_t* localsymbols, elfheader_t* h) { if(box64_dump && h->DynSym) DumpDynSym(h); + int libcef = (strstr(h->name, "libcef.so"))?1:0; + //libcef.so is linked with tcmalloc staticaly, but this cannot be easily supported in box64, so hacking some "unlink" here + const char* avoid_libcef[] = {"malloc", "realloc", "free", "calloc", "cfree", + "__libc_calloc", "__libc_cfree", "__libc_memallign", "__liv_pvalloc", + "__libcrealloc", "__libc_valloc", "__posix_memalign", + "valloc", "pvalloc", "posix_memalign", "malloc_stats", "malloc_usable_size", + /*"mallopt",*/ "localtime_r", + //c++ symbol from libstdc++ too + //"_ZnwmRKSt9nothrow_t", "_ZdaPv", // operator new(unsigned long, std::nothrow_t const&), operator delete[](void*) + //"_Znwm", "_ZdlPv", "_Znam", // operator new(unsigned long), operator delete(void*), operator new[](unsigned long) + //"_ZnwmSt11align_val_t", "_ZnwmSt11align_val_tRKSt9nothrow_t", // operator new(unsigned long, std::align_val_t) + //"_ZnamSt11align_val_t", "_ZnamSt11align_val_tRKSt9nothrow_t", // operator new[](unsigned long, std::align_val_t) + //"_ZdlPvRKSt9nothrow_t", "_ZdaPvSt11align_val_tRKSt9nothrow_t", // more delete operators + //"_ZdlPvmSt11align_val_t", "_ZdaPvRKSt9nothrow_t", + //"_ZdaPvSt11align_val_t", "_ZdlPvSt11align_val_t", + }; printf_dump(LOG_NEVER, "Will look for Symbol to add in SymTable(%zu)\n", h->numSymTab); for (size_t i=0; i<h->numSymTab; ++i) { const char * symname = h->StrTab+h->SymTab[i].st_name; @@ -925,7 +941,15 @@ void AddSymbols(lib_t *maplib, kh_mapsymbols_t* mapsymbols, kh_mapsymbols_t* wea AddSymbol(mapsymbols, symname, offs, sz, 2, vername); } } else { - if((bind==STB_GNU_UNIQUE /*|| (bind==STB_GLOBAL && type==STT_FUNC)*/) && FindGlobalSymbol(maplib, symname, -1, NULL)) + int to_add = 1; + if(libcef) { + if(strstr(symname, "_Zn")==symname || strstr(symname, "_Zd")==symname) + to_add = 0; + for(int j=0; j<sizeof(avoid_libcef)/sizeof(avoid_libcef[0]) && to_add; ++j) + if(!strcmp(symname, avoid_libcef[j])) + to_add = 0; + } + if(!to_add || (bind==STB_GNU_UNIQUE && FindGlobalSymbol(maplib, symname, -1, NULL))) continue; uintptr_t offs = (type==STT_TLS)?h->SymTab[i].st_value:(h->SymTab[i].st_value + h->delta); printf_dump(LOG_NEVER, "Adding Symbol(bind=%s) \"%s\" with offset=%p sz=%zu\n", (bind==STB_LOCAL)?"LOCAL":((bind==STB_WEAK)?"WEAK":"GLOBAL"), symname, (void*)offs, sz); @@ -954,7 +978,15 @@ void AddSymbols(lib_t *maplib, kh_mapsymbols_t* mapsymbols, kh_mapsymbols_t* wea int version = h->VerSym?((Elf64_Half*)((uintptr_t)h->VerSym+h->delta))[i]:-1; if(version!=-1) version &= 0x7fff; const char* vername = GetSymbolVersion(h, version); - if((bind==STB_GNU_UNIQUE /*|| (bind==STB_GLOBAL && type==STT_FUNC)*/) && FindGlobalSymbol(maplib, symname, version, vername)) + int to_add = 1; + if(libcef) { + if(strstr(symname, "_Zn")==symname || strstr(symname, "_Zd")==symname) + to_add = 0; + for(int j=0; j<sizeof(avoid_libcef)/sizeof(avoid_libcef[0]) && to_add; ++j) + if(!strcmp(symname, avoid_libcef[j])) + to_add = 0; + } + if(!to_add || (bind==STB_GNU_UNIQUE && FindGlobalSymbol(maplib, symname, version, vername))) continue; printf_dump(LOG_NEVER, "Adding Versionned Symbol(bind=%s) \"%s\" (ver=%d/%s) with offset=%p sz=%zu\n", (bind==STB_LOCAL)?"LOCAL":((bind==STB_WEAK)?"WEAK":"GLOBAL"), symname, version, vername?vername:"(none)", (void*)offs, sz); if(bind==STB_LOCAL) |