diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-05 11:00:23 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-05 11:00:23 +0100 |
| commit | 0bf9a5af347778ed1e6d7f20bf684259573794be (patch) | |
| tree | 58c3a58e4d51278a9cf118ce3e1a24a4eed95c83 /src | |
| parent | 3da0e6c633352d2105e8758e482b2e8689894df9 (diff) | |
| download | box64-0bf9a5af347778ed1e6d7f20bf684259573794be.tar.gz box64-0bf9a5af347778ed1e6d7f20bf684259573794be.zip | |
Fixed PltResolver slot handling
Diffstat (limited to 'src')
| -rwxr-xr-x | src/elfs/elfloader.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c index 8ebc51f1..b9aa83bd 100755 --- a/src/elfs/elfloader.c +++ b/src/elfs/elfloader.c @@ -481,6 +481,7 @@ int RelocateElfREL(lib_t *maplib, lib_t *local_maplib, elfheader_t* head, int cn *p += offs; } break; + #if 0 case R_X86_64_JUMP_SLOT: // apply immediatly for gobject closure marshal or for LOCAL binding. Also, apply immediatly if it doesn't jump in the got tmp = (uintptr_t)(*p); @@ -509,6 +510,7 @@ int RelocateElfREL(lib_t *maplib, lib_t *local_maplib, elfheader_t* head, int cn *p += head->delta; } break; + #endif default: printf_log(LOG_INFO, "Warning, don't know of to handle rel #%d %s (%p)\n", i, DumpRelType(ELF64_R_TYPE(rel[i].r_info)), p); } @@ -1237,12 +1239,12 @@ EXPORT void PltResolver(x64emu_t* emu) elfheader_t *h = (elfheader_t*)addr; printf_log(LOG_DEBUG, "PltResolver: Addr=%p, Slot=%d Return=%p: elf is %s\n", (void*)addr, slot, *(void**)(R_RSP), h->name); - Elf64_Rel * rel = (Elf64_Rel *)(h->jmprel + h->delta + slot); + Elf64_Rela * rel = (Elf64_Rela *)(h->jmprel + h->delta) + slot; Elf64_Sym *sym = &h->DynSym[ELF64_R_SYM(rel->r_info)]; int bind = ELF64_ST_BIND(sym->st_info); const char* symname = SymName(h, sym); - uint32_t *p = (uint32_t*)(rel->r_offset + h->delta); + uint64_t *p = (uint64_t*)(rel->r_offset + h->delta); uintptr_t offs = 0; uintptr_t end = 0; |