about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-07-05 11:55:10 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-07-05 11:55:10 +0200
commita8a45aede350c76611955adb4161686c7f2863bc (patch)
tree632e3a3e627d51c4ae6ca1a9b583bde5b1940f2f /src
parent28c6d721101bff053b565ce810b462b7ad119fad (diff)
downloadbox64-a8a45aede350c76611955adb4161686c7f2863bc.tar.gz
box64-a8a45aede350c76611955adb4161686c7f2863bc.zip
Try to speedup a bit FindR64COPYRel
Diffstat (limited to 'src')
-rwxr-xr-xsrc/elfs/elfloader.c18
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;