diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-05-16 10:54:44 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-05-16 10:54:44 +0200 |
| commit | 8fe7378f8613a7f249464bf5be48508bf02dc05c (patch) | |
| tree | d716e26cf2d544c190b74cf3f4d86606cdd7e877 /src | |
| parent | 1224ffa7cdab1e7223bfdcec7568d02402862516 (diff) | |
| download | box64-8fe7378f8613a7f249464bf5be48508bf02dc05c.tar.gz box64-8fe7378f8613a7f249464bf5be48508bf02dc05c.zip | |
Small hack on elfloader (for Torchlight2 and Unity3D and Dosbox)
Diffstat (limited to 'src')
| -rwxr-xr-x | src/elfs/elfloader.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c index ed25e7b6..8890d50a 100755 --- a/src/elfs/elfloader.c +++ b/src/elfs/elfloader.c @@ -425,9 +425,14 @@ int RelocateElfREL(lib_t *maplib, lib_t *local_maplib, elfheader_t* head, int cn // set global offs / size for the symbol offs = sym->st_value + head->delta; end = offs + sym->st_size; - printf_log(LOG_DUMP, "Apply %s R_X86_64_GLOB_DAT with R_X86_64_COPY @%p/%p (%p/%p -> %p/%p) size=%ld on sym=%s \n", (bind==STB_LOCAL)?"Local":"Global", p, globp, (void*)(p?(*p):0), (void*)(globp?(*globp):0), (void*)offs, (void*)globoffs, sym->st_size, symname); + if(sym->st_size) { + printf_log(LOG_DUMP, "Apply %s R_X86_64_GLOB_DAT with R_X86_64_COPY @%p/%p (%p/%p -> %p/%p) size=%ld on sym=%s \n", (bind==STB_LOCAL)?"Local":"Global", p, globp, (void*)(p?(*p):0), (void*)(globp?(*globp):0), (void*)offs, (void*)globoffs, sym->st_size, symname); + //memmove((void*)globoffs, (void*)offs, sym->st_size); // preapply to copy part from lib to main elf + AddWeakSymbol(GetGlobalData(maplib), symname, offs, sym->st_size); + } else { + printf_log(LOG_DUMP, "Apply %s R_X86_64_GLOB_DAT with R_X86_64_COPY @%p/%p (%p/%p -> %p/%p) null sized on sym=%s \n", (bind==STB_LOCAL)?"Local":"Global", p, globp, (void*)(p?(*p):0), (void*)(globp?(*globp):0), (void*)offs, (void*)globoffs, symname); + } *p = globoffs; - AddWeakSymbol(GetGlobalData(maplib), symname, offs, end-offs+1); } else { // Look for same symbol already loaded but not in self (so no need for local_maplib here) if (GetGlobalNoWeakSymbolStartEnd(maplib, symname, &globoffs, &globend)) { @@ -595,15 +600,14 @@ int RelocateElfRELA(lib_t *maplib, lib_t *local_maplib, elfheader_t* head, int c printf_log(LOG_DUMP, "Apply %s R_X86_64_GLOB_DAT with R_X86_64_COPY @%p/%p (%p/%p -> %p/%p) size=%ld on sym=%s \n", (bind==STB_LOCAL)?"Local":"Global", p, globp, (void*)(p?(*p):0), (void*)(globp?(*globp):0), (void*)offs, (void*)globoffs, sym->st_size, symname); - memmove((void*)globoffs, (void*)offs, sym->st_size); // preapply to copy part from lib to main elf - *p = globoffs/* + rela[i].r_addend*/; //no addend? - AddWeakSymbol(GetGlobalData(maplib), symname, offs, end-offs+1); + //memmove((void*)globoffs, (void*)offs, sym->st_size); // preapply to copy part from lib to main elf + AddWeakSymbol(GetGlobalData(maplib), symname, offs, sym->st_size); } else { printf_log(LOG_DUMP, "Apply %s R_X86_64_GLOB_DAT with R_X86_64_COPY @%p/%p (%p/%p -> %p/%p) null sized on sym=%s \n", (bind==STB_LOCAL)?"Local":"Global", p, globp, (void*)(p?(*p):0), (void*)(globp?(*globp):0), (void*)offs, (void*)globoffs, symname); - *p = globoffs; } + *p = globoffs; } else { // Look for same symbol already loaded but not in self (so no need for local_maplib here) if (GetGlobalNoWeakSymbolStartEnd(maplib, symname, &globoffs, &globend)) { @@ -860,7 +864,7 @@ void AddSymbols(lib_t *maplib, kh_mapsymbols_t* mapsymbols, kh_mapsymbols_t* wea int vis = h->SymTab[i].st_other&0x3; if((type==STT_OBJECT || type==STT_FUNC || type==STT_COMMON || type==STT_TLS || type==STT_NOTYPE) && (vis==STV_DEFAULT || vis==STV_PROTECTED) && (h->SymTab[i].st_shndx!=0)) { - if((bind==10/*STB_GNU_UNIQUE*/ || (bind==STB_GLOBAL && type==STT_FUNC)) && FindGlobalSymbol(maplib, symname)) + if((bind==STB_GNU_UNIQUE /*|| (bind==STB_GLOBAL && type==STT_FUNC)*/) && FindGlobalSymbol(maplib, symname)) continue; uintptr_t offs = (type==STT_TLS)?h->SymTab[i].st_value:(h->SymTab[i].st_value + h->delta); uint64_t sz = h->SymTab[i].st_size; @@ -885,7 +889,7 @@ void AddSymbols(lib_t *maplib, kh_mapsymbols_t* mapsymbols, kh_mapsymbols_t* wea //st_shndx==65521 means ABS value if((type==STT_OBJECT || type==STT_FUNC || type==STT_COMMON || type==STT_TLS || type==STT_NOTYPE) && (vis==STV_DEFAULT || vis==STV_PROTECTED) && (h->DynSym[i].st_shndx!=0 && h->DynSym[i].st_shndx<=65521)) { - if((bind==10/*STB_GNU_UNIQUE*/ || (bind==STB_GLOBAL && type==STT_FUNC)) && FindGlobalSymbol(maplib, symname)) + if((bind==STB_GNU_UNIQUE || (bind==STB_GLOBAL && type==STT_FUNC)) && FindGlobalSymbol(maplib, symname)) continue; uintptr_t offs = (type==STT_TLS)?h->DynSym[i].st_value:(h->DynSym[i].st_value + h->delta); uint64_t sz = h->DynSym[i].st_size; |