diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-07-05 11:55:10 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-07-05 11:55:10 +0200 |
| commit | a8a45aede350c76611955adb4161686c7f2863bc (patch) | |
| tree | 632e3a3e627d51c4ae6ca1a9b583bde5b1940f2f | |
| parent | 28c6d721101bff053b565ce810b462b7ad119fad (diff) | |
| download | box64-a8a45aede350c76611955adb4161686c7f2863bc.tar.gz box64-a8a45aede350c76611955adb4161686c7f2863bc.zip | |
Try to speedup a bit FindR64COPYRel
| -rwxr-xr-x | src/elfs/elfloader.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c index 4b5e76c1..7ebf8691 100755 --- a/src/elfs/elfloader.c +++ b/src/elfs/elfloader.c @@ -371,14 +371,16 @@ int FindR64COPYRel(elfheader_t* h, const char* name, uintptr_t *offs, uint64_t** int t = ELF64_R_TYPE(rel[i].r_info); Elf64_Sym *sym = &h->DynSym[ELF64_R_SYM(rel[i].r_info)]; const char* symname = SymName(h, sym); - int version2 = h->VerSym?((Elf64_Half*)((uintptr_t)h->VerSym+h->delta))[ELF64_R_SYM(rel[i].r_info)]:-1; - if(version2!=-1) version2 &= 0x7fff; - if(version && !version2) version2=-1; // match a versionned symbol against a global "local" symbol - const char* vername2 = GetSymbolVersion(h, version2); - if(SameVersionnedSymbol(name, version, vername, symname, version2, vername2) && t==R_X86_64_COPY) { - *offs = sym->st_value + h->delta; - *p = (uint64_t*)(rel[i].r_offset + h->delta + rel[i].r_addend); - return 1; + if(t==R_X86_64_COPY && symname && !strcmp(symname, name)) { + int version2 = h->VerSym?((Elf64_Half*)((uintptr_t)h->VerSym+h->delta))[ELF64_R_SYM(rel[i].r_info)]:-1; + if(version2!=-1) version2 &= 0x7fff; + if(version && !version2) version2=-1; // match a versionned symbol against a global "local" symbol + const char* vername2 = GetSymbolVersion(h, version2); + if(SameVersionnedSymbol(name, version, vername, symname, version2, vername2)) { + *offs = sym->st_value + h->delta; + *p = (uint64_t*)(rel[i].r_offset + h->delta + rel[i].r_addend); + return 1; + } } } return 0; |