about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-06-15 17:14:09 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-06-15 17:14:09 +0200
commit6e6a8f47afb855f547bb132be56f68bf27b8f096 (patch)
tree11d17e26966a508afab640c176b300af782c49de /src
parent7a57c70d818d168ec43e2855f627239e6931ac51 (diff)
downloadbox64-6e6a8f47afb855f547bb132be56f68bf27b8f096.tar.gz
box64-6e6a8f47afb855f547bb132be56f68bf27b8f096.zip
Added some speicifc workaround for libcef (staticaly linked with tcmalloc)
Diffstat (limited to 'src')
-rwxr-xr-xsrc/elfs/elfloader.c36
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)