diff options
Diffstat (limited to 'src')
| -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; |