diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-08-16 10:56:47 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-08-16 10:56:47 +0200 |
| commit | b2f94b274cbd479a58b15161a8c6601b2ee1d072 (patch) | |
| tree | 13ab85ff9ff22eea5e8812e5f3cdacb2e2efc835 /src | |
| parent | 34b85b3560385d4aef73c64548e200f6bb0e264e (diff) | |
| download | box64-b2f94b274cbd479a58b15161a8c6601b2ee1d072.tar.gz box64-b2f94b274cbd479a58b15161a8c6601b2ee1d072.zip | |
[BOX32] Start differentiate 64bits from 32bits in elf parser
Diffstat (limited to 'src')
| -rw-r--r-- | src/elfs/elfloader.c | 28 | ||||
| -rw-r--r-- | src/elfs/elfloader_private.h | 4 | ||||
| -rw-r--r-- | src/elfs/elfparser.c | 10 |
3 files changed, 21 insertions, 21 deletions
diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c index 016ae50b..cd23e958 100644 --- a/src/elfs/elfloader.c +++ b/src/elfs/elfloader.c @@ -55,7 +55,7 @@ int getElfIndex(box64context_t* ctx, elfheader_t* head) { elfheader_t* LoadAndCheckElfHeader(FILE* f, const char* name, int exec) { - elfheader_t *h = ParseElfHeader(f, name, exec); + elfheader_t *h = ParseElfHeader64(f, name, exec); if(!h) return NULL; @@ -602,14 +602,14 @@ int RelocateElfRELA(lib_t *maplib, lib_t *local_maplib, int bindnow, int deepbin // can be ignored break; case R_X86_64_RELATIVE: - printf_dump(LOG_NEVER, "Apply %s R_X86_64_RELATIVE @%p (%p -> %p)\n", BindSym(bind), p, *(void**)p, (void*)(head->delta+ rela[i].r_addend)); + printf_dump(LOG_NEVER, "Apply %s R_X86_64_RELATIVE @%p (%p -> %p)\n", BindSym64(bind), p, *(void**)p, (void*)(head->delta+ rela[i].r_addend)); *p = head->delta+ rela[i].r_addend; break; case R_X86_64_IRELATIVE: { x64emu_t* emu = thread_get_emu(); EmuCall(emu, head->delta+rela[i].r_addend); - printf_dump(LOG_NEVER, "Apply %s R_X86_64_IRELATIVE @%p (%p -> %p()=%p)\n", BindSym(bind), p, *(void**)p, (void*)(head->delta+ rela[i].r_addend), (void*)(R_RAX)); + printf_dump(LOG_NEVER, "Apply %s R_X86_64_IRELATIVE @%p (%p -> %p()=%p)\n", BindSym64(bind), p, *(void**)p, (void*)(head->delta+ rela[i].r_addend), (void*)(R_RAX)); *p = R_RAX; } break; @@ -639,7 +639,7 @@ int RelocateElfRELA(lib_t *maplib, lib_t *local_maplib, int bindnow, int deepbin if(GetSymbolStartEnd(my_context->globdata, symname, &globoffs, &globend, version, vername, 1, veropt)) { globp = (uint64_t*)globoffs; printf_dump(LOG_NEVER, "Apply %s R_X86_64_GLOB_DAT with R_X86_64_COPY @%p/%p (%p/%p -> %p/%p) size=%zd on sym=%s (%sver=%d/%s) \n", - BindSym(bind), p, globp, (void*)(p?(*p):0), + BindSym64(bind), p, globp, (void*)(p?(*p):0), (void*)(globp?(*globp):0), (void*)offs, (void*)globoffs, sym->st_size, symname, veropt?"opt":"", version, vername?vername:"(none)"); sym_elf = my_context->elfs[0]; *p = globoffs; @@ -648,7 +648,7 @@ int RelocateElfRELA(lib_t *maplib, lib_t *local_maplib, int bindnow, int deepbin if(strcmp(symname, "__gmon_start__") && strcmp(symname, "data_start") && strcmp(symname, "__data_start") && strcmp(symname, "collector_func_load")) printf_log((bind==STB_WEAK)?LOG_DEBUG:LOG_NONE, "%s: Global Symbol %s not found, cannot apply R_X86_64_GLOB_DAT @%p (%p) in %s\n", (bind==STB_WEAK)?"Warning":"Error", symname, p, *(void**)p, head->name); } else { - printf_dump(LOG_NEVER, "Apply %s R_X86_64_GLOB_DAT @%p (%p -> %p) on sym=%s (%sver=%d/%s, elf=%s)\n", BindSym(bind), p, (void*)(p?(*p):0), (void*)(offs + rela[i].r_addend), symname, veropt?"opt":"", version, vername?vername:"(none)", sym_elf?sym_elf->name:"(native)"); + printf_dump(LOG_NEVER, "Apply %s R_X86_64_GLOB_DAT @%p (%p -> %p) on sym=%s (%sver=%d/%s, elf=%s)\n", BindSym64(bind), p, (void*)(p?(*p):0), (void*)(offs + rela[i].r_addend), symname, veropt?"opt":"", version, vername?vername:"(none)", sym_elf?sym_elf->name:"(native)"); *p = offs + rela[i].r_addend; if(sym_elf && sym_elf!=last_elf && sym_elf!=head) last_elf = checkElfLib(head, sym_elf->lib); } @@ -676,7 +676,7 @@ int RelocateElfRELA(lib_t *maplib, lib_t *local_maplib, int bindnow, int deepbin } else { if(p) { printf_dump(LOG_NEVER, "Apply %s R_X86_64_JUMP_SLOT @%p with sym=%s (%p -> %p / %s (%sver=%d / %s))\n", - BindSym(bind), p, symname, *(void**)p, (void*)(offs+rela[i].r_addend), sym_elf?sym_elf->name:"native", veropt?"opt":"", version, vername?vername:"(none)"); + BindSym64(bind), p, symname, *(void**)p, (void*)(offs+rela[i].r_addend), sym_elf?sym_elf->name:"native", veropt?"opt":"", version, vername?vername:"(none)"); *p = offs + rela[i].r_addend; if(sym_elf && sym_elf!=last_elf && sym_elf!=head) last_elf = checkElfLib(head, sym_elf->lib); } else { @@ -685,7 +685,7 @@ int RelocateElfRELA(lib_t *maplib, lib_t *local_maplib, int bindnow, int deepbin } } else { printf_dump(LOG_NEVER, "Preparing (if needed) %s R_X86_64_JUMP_SLOT @%p (0x%lx->0x%0lx) with sym=%s to be apply later (addend=%ld)\n", - BindSym(bind), p, *p, *p+head->delta, symname, rela[i].r_addend); + BindSym64(bind), p, *p, *p+head->delta, symname, rela[i].r_addend); *p += head->delta; *need_resolv = 1; } @@ -704,7 +704,7 @@ int RelocateElfRELA(lib_t *maplib, lib_t *local_maplib, int bindnow, int deepbin ret_ok = 1; } else { printf_dump(LOG_NEVER, "Apply %s R_X86_64_64 @%p with sym=%s (%sver=%d/%s) addend=0x%lx (%p -> %p)\n", - BindSym(bind), p, symname, veropt?"opt":"", version, vername?vername:"(none)", rela[i].r_addend, *(void**)p, (void*)(offs+rela[i].r_addend/*+*(uint64_t*)p*/)); + BindSym64(bind), p, symname, veropt?"opt":"", version, vername?vername:"(none)", rela[i].r_addend, *(void**)p, (void*)(offs+rela[i].r_addend/*+*(uint64_t*)p*/)); *p /*+*/= offs+rela[i].r_addend; if(sym_elf && sym_elf!=last_elf && sym_elf!=head) last_elf = checkElfLib(head, sym_elf->lib); } @@ -718,11 +718,11 @@ int RelocateElfRELA(lib_t *maplib, lib_t *local_maplib, int bindnow, int deepbin } if(sym_elf) { delta = *(int64_t*)p; - printf_dump(LOG_NEVER, "Applying %s %s on %s @%p (%ld -> %ld+%ld+%ld, size=%ld)\n", BindSym(bind), DumpRelType(t), symname, p, delta, sym_elf->tlsbase, (int64_t)offs, rela[i].r_addend, end-offs); + printf_dump(LOG_NEVER, "Applying %s %s on %s @%p (%ld -> %ld+%ld+%ld, size=%ld)\n", BindSym64(bind), DumpRelType(t), symname, p, delta, sym_elf->tlsbase, (int64_t)offs, rela[i].r_addend, end-offs); *p = (uintptr_t)((int64_t)offs + rela[i].r_addend + sym_elf->tlsbase); if(sym_elf && sym_elf!=last_elf && sym_elf!=head) last_elf = checkElfLib(head, sym_elf->lib); } else { - printf_log(LOG_INFO, "Warning, cannot apply %s %s on %s @%p (%ld), no elf_header found\n", BindSym(bind), DumpRelType(t), symname, p, (int64_t)offs); + printf_log(LOG_INFO, "Warning, cannot apply %s %s on %s @%p (%ld), no elf_header found\n", BindSym64(bind), DumpRelType(t), symname, p, (int64_t)offs); } } break; @@ -735,7 +735,7 @@ int RelocateElfRELA(lib_t *maplib, lib_t *local_maplib, int bindnow, int deepbin offs = getElfIndex(my_context, sym_elf); } if(p) { - printf_dump(LOG_NEVER, "Apply %s %s @%p with sym=%s (%p -> %p)\n", BindSym(bind), "R_X86_64_DTPMOD64", p, symname, *(void**)p, (void*)offs); + printf_dump(LOG_NEVER, "Apply %s %s @%p with sym=%s (%p -> %p)\n", BindSym64(bind), "R_X86_64_DTPMOD64", p, symname, *(void**)p, (void*)offs); *p = offs; if(sym_elf && sym_elf!=last_elf && sym_elf!=head) last_elf = checkElfLib(head, sym_elf->lib); } else { @@ -758,7 +758,7 @@ int RelocateElfRELA(lib_t *maplib, lib_t *local_maplib, int bindnow, int deepbin } if(p) { int64_t tlsoffset = (int64_t)offs; // it's not an offset in elf memory - printf_dump(LOG_NEVER, "Apply %s R_X86_64_DTPOFF64 @%p with sym=%s (%p -> %p)\n", BindSym(bind), p, symname, (void*)tlsoffset, (void*)offs); + printf_dump(LOG_NEVER, "Apply %s R_X86_64_DTPOFF64 @%p with sym=%s (%p -> %p)\n", BindSym64(bind), p, symname, (void*)tlsoffset, (void*)offs); *p = tlsoffset; if(sym_elf && sym_elf!=last_elf && sym_elf!=head) last_elf = checkElfLib(head, sym_elf->lib); } else { @@ -768,7 +768,7 @@ int RelocateElfRELA(lib_t *maplib, lib_t *local_maplib, int bindnow, int deepbin break; case R_X86_64_TLSDESC: if(!symname || !symname[0]) { - printf_dump(LOG_NEVER, "Apply %s R_X86_64_TLSDESC @%p with addend=%zu\n", BindSym(bind), p, rela[i].r_addend); + printf_dump(LOG_NEVER, "Apply %s R_X86_64_TLSDESC @%p with addend=%zu\n", BindSym64(bind), p, rela[i].r_addend); struct tlsdesc volatile *td = (struct tlsdesc volatile *)p; if(!tlsdescUndefweak) tlsdescUndefweak = AddBridge(my_context->system, pFE, my__dl_tlsdesc_undefweak, 0, "_dl_tlsdesc_undefweak"); @@ -1763,7 +1763,7 @@ EXPORT void PltResolver(x64emu_t* emu) offs = (uintptr_t)getAlternate((void*)offs); if(p) { - printf_dump(LOG_DEBUG, " Apply %s R_X86_64_JUMP_SLOT %p with sym=%s(%sver %d: %s%s%s) (%p -> %p / %s)\n", BindSym(bind), p, symname, veropt?"opt":"", version, symname, vername?"@":"", vername?vername:"",*(void**)p, (void*)offs, ElfName(sym_elf)); + printf_dump(LOG_DEBUG, " Apply %s R_X86_64_JUMP_SLOT %p with sym=%s(%sver %d: %s%s%s) (%p -> %p / %s)\n", BindSym64(bind), p, symname, veropt?"opt":"", version, symname, vername?"@":"", vername?vername:"",*(void**)p, (void*)offs, ElfName(sym_elf)); *p = offs; if(sym_elf && sym_elf!=h) checkElfLib(h, sym_elf->lib); } else { diff --git a/src/elfs/elfloader_private.h b/src/elfs/elfloader_private.h index d813488c..93750f49 100644 --- a/src/elfs/elfloader_private.h +++ b/src/elfs/elfloader_private.h @@ -176,9 +176,9 @@ typedef struct elfheader_s { #define ELF64_ST_VISIBILITY(o) ((o) & 0x03) #endif -elfheader_t* ParseElfHeader(FILE* f, const char* name, int exec); +elfheader_t* ParseElfHeader64(FILE* f, const char* name, int exec); -const char* BindSym(int bind); +const char* BindSym64(int bind); Elf64_Half GetSymbolVersionFlag(elfheader_t* h, int index); diff --git a/src/elfs/elfparser.c b/src/elfs/elfparser.c index 49fea7aa..9a8f6bee 100644 --- a/src/elfs/elfparser.c +++ b/src/elfs/elfparser.c @@ -17,7 +17,7 @@ #define DT_GNU_HASH 0x6ffffef5 #endif -int LoadSH(FILE *f, Elf64_Shdr *s, void** SH, const char* name, uint32_t type) +static int LoadSH(FILE *f, Elf64_Shdr *s, void** SH, const char* name, uint32_t type) { if(type && (s->sh_type != type)) { printf_log(LOG_INFO, "Section Header \"%s\" (off=%ld, size=%ld) has incorect type (%d != %d)\n", name, s->sh_offset, s->sh_size, s->sh_type, type); @@ -36,7 +36,7 @@ int LoadSH(FILE *f, Elf64_Shdr *s, void** SH, const char* name, uint32_t type) return 0; } -int FindSection(Elf64_Shdr *s, int n, char* SHStrTab, const char* name) +static int FindSection(Elf64_Shdr *s, int n, char* SHStrTab, const char* name) { for (int i=0; i<n; ++i) { if(s[i].sh_type!=SHT_NULL) @@ -46,7 +46,7 @@ int FindSection(Elf64_Shdr *s, int n, char* SHStrTab, const char* name) return 0; } -void LoadNamedSection(FILE *f, Elf64_Shdr *s, int size, char* SHStrTab, const char* name, const char* clearname, uint32_t type, void** what, size_t* num) +static void LoadNamedSection(FILE *f, Elf64_Shdr *s, int size, char* SHStrTab, const char* name, const char* clearname, uint32_t type, void** what, size_t* num) { int n = FindSection(s, size, SHStrTab, name); printf_dump(LOG_DEBUG, "Loading %s (idx = %d)\n", clearname, n); @@ -61,7 +61,7 @@ void LoadNamedSection(FILE *f, Elf64_Shdr *s, int size, char* SHStrTab, const ch } } -elfheader_t* ParseElfHeader(FILE* f, const char* name, int exec) +elfheader_t* ParseElfHeader64(FILE* f, const char* name, int exec) { Elf64_Ehdr header; int level = (exec)?LOG_INFO:LOG_DEBUG; @@ -394,7 +394,7 @@ elfheader_t* ParseElfHeader(FILE* f, const char* name, int exec) return h; } -const char* BindSym(int bind) +const char* BindSym64(int bind) { switch(bind) { case STB_GLOBAL: return "STB_GLOBAL"; |