diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-09-14 16:45:44 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-09-14 16:45:44 +0200 |
| commit | e5ad7c36ecba49d39150530f792cf3be4d122df1 (patch) | |
| tree | c8cca8ac272ce0725465457d0e197b478b43f455 /src | |
| parent | 3b8ba5dfa645e267fe6a949985f1e2acdb61b2d4 (diff) | |
| download | box64-e5ad7c36ecba49d39150530f792cf3be4d122df1.tar.gz box64-e5ad7c36ecba49d39150530f792cf3be4d122df1.zip | |
[BOX32][ELFLOADER] Fixed some issue with symbol resolver
Diffstat (limited to 'src')
| -rw-r--r-- | src/elfs/elfloader32.c | 33 | ||||
| -rw-r--r-- | src/elfs/elfloader_private.h | 1 | ||||
| -rw-r--r-- | src/elfs/elfparser.c | 13 | ||||
| -rw-r--r-- | src/librarian/symbols.c | 1 |
4 files changed, 35 insertions, 13 deletions
diff --git a/src/elfs/elfloader32.c b/src/elfs/elfloader32.c index 9f2dfa45..4330e5c5 100644 --- a/src/elfs/elfloader32.c +++ b/src/elfs/elfloader32.c @@ -94,16 +94,16 @@ static Elf32_Sym* ElfLocateSymbol(elfheader_t* head, uintptr_t *offs, uintptr_t static void GrabX32CopyMainElfReloc(elfheader_t* head) { - if(head->rela) { - int cnt = head->relasz / head->relaent; - Elf32_Rela* rela = (Elf32_Rela *)(head->rela + head->delta); + if(head->rel) { + int cnt = head->relsz / head->relent; + Elf32_Rel* rel = (Elf32_Rel *)(head->rel + head->delta); printf_dump(LOG_DEBUG, "Grabbing R_386_COPY Relocation(s) in advance for %s\n", head->name); for (int i=0; i<cnt; ++i) { - int t = ELF32_R_TYPE(rela[i].r_info); + int t = ELF32_R_TYPE(rel[i].r_info); if(t == R_386_COPY) { - Elf32_Sym *sym = &head->DynSym._32[ELF32_R_SYM(rela[i].r_info)]; + Elf32_Sym *sym = &head->DynSym._32[ELF32_R_SYM(rel[i].r_info)]; const char* symname = SymName32(head, sym); - int version = head->VerSym?((Elf32_Half*)((uintptr_t)head->VerSym+head->delta))[ELF32_R_SYM(rela[i].r_info)]:-1; + int version = head->VerSym?((Elf32_Half*)((uintptr_t)head->VerSym+head->delta))[ELF32_R_SYM(rel[i].r_info)]:-1; if(version!=-1) version &=0x7fff; const char* vername = GetSymbolVersion(head, version); Elf32_Half flags = GetSymbolVersionFlag(head, version); @@ -358,9 +358,9 @@ static elfheader_t* FindElfSymbol(box64context_t *context, Elf32_Sym* sym) void GrabR386CopyMainElfReloc(elfheader_t* head) { - if(head->rela) { - int cnt = head->relasz / head->relaent; - Elf32_Rel* rel = (Elf32_Rel *)(head->rela + head->delta); + if(head->rel) { + int cnt = head->relsz / head->relent; + Elf32_Rel* rel = (Elf32_Rel *)(head->rel + head->delta); printf_dump(LOG_DEBUG, "Grabbing R_386_COPY Relocation(s) in advance for %s\n", head->name); for (int i=0; i<cnt; ++i) { int t = ELF32_R_TYPE(rel[i].r_info); @@ -506,7 +506,7 @@ static int RelocateElfREL(lib_t *maplib, lib_t *local_maplib, int bindnow, int d if(!offs) {offs = globoffs; end = globend;} if(offs) { // add r_addend to p? - printf_dump(LOG_NEVER, "Apply R_386_COPY @%p with sym=%s (%sver=%d/%s), @%p size=%ld\n", p, symname, veropt?"opt":"", version, vername?vername:"(none)", from_ptrv(offs), sym->st_size); + printf_dump(LOG_NEVER, "Apply R_386_COPY @%p with sym=%s (%sver=%d/%s), @%p size=%d\n", p, symname, veropt?"opt":"", version, vername?vername:"(none)", from_ptrv(offs), sym->st_size); if(p!=from_ptrv(offs)) memmove(p, from_ptrv(offs), sym->st_size); sym_elf = FindElfAddress(my_context, offs); @@ -518,8 +518,8 @@ static int RelocateElfREL(lib_t *maplib, lib_t *local_maplib, int bindnow, int d case R_386_GLOB_DAT: if(GetSymbolStartEnd(my_context->globdata, symname, &globoffs, &globend, version, vername, 1, veropt)) { globp = (uint32_t*)globoffs; - printf_dump(LOG_NEVER, "Apply %s R_386_GLOB_DAT with R_386_COPY @%p/%p (%p/%p -> %p/%p) size=%zd on sym=%s (%sver=%d/%s) \n", - BindSym(bind), p, globp, from_ptrv(p?(*p):0), + printf_dump(LOG_NEVER, "Apply %s R_386_GLOB_DAT with R_386_COPY @%p/%p (%p/%p -> %p/%p) size=%d on sym=%s (%sver=%d/%s) \n", + BindSymFriendly(bind), p, globp, from_ptrv(p?(*p):0), from_ptrv(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; @@ -528,7 +528,7 @@ static int RelocateElfREL(lib_t *maplib, lib_t *local_maplib, int bindnow, int d 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_386_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_386_GLOB_DAT @%p (%p -> %p) on sym=%s (%sver=%d/%s, elf=%s)\n", BindSym(bind), p, from_ptrv(p?(*p):0), from_ptrv(offs), symname, veropt?"opt":"", version, vername?vername:"(none)", sym_elf?sym_elf->name:"(native)"); + printf_dump(LOG_NEVER, "Apply %s R_386_GLOB_DAT @%p (%p -> %p) on sym=%s (%sver=%d/%s, elf=%s)\n", BindSymFriendly(bind), p, from_ptrv(p?(*p):0), from_ptrv(offs), symname, veropt?"opt":"", version, vername?vername:"(none)", sym_elf?sym_elf->name:"(native)"); *p = offs; if(sym_elf && sym_elf!=last_elf && sym_elf!=head) last_elf = checkElfLib(head, sym_elf->lib); } @@ -567,6 +567,13 @@ static int RelocateElfREL(lib_t *maplib, lib_t *local_maplib, int bindnow, int d } break; case R_386_32: + if(GetSymbolStartEnd(my_context->globdata, symname, &globoffs, &globend, version, vername, 1, veropt)) { + if(offs!=globoffs) { + offs = globoffs; + sym_elf = my_context->elfs[0]; + elfsym = ElfDynSymLookup32(sym_elf, symname); + } + } if (!offs) { if(strcmp(symname, "__gmon_start__") && strcmp(symname, "data_start") && strcmp(symname, "__data_start")) { printf_log(LOG_NONE, "Error: Symbol sym=%s(%s%s%s/version %d) not found, cannot apply R_386_32 %p (%p) in %s\n", symname, symname, vername?"@":"", vername?vername:"", version, p, from_ptrv(*p), head->name); diff --git a/src/elfs/elfloader_private.h b/src/elfs/elfloader_private.h index 535dbfad..61de1a43 100644 --- a/src/elfs/elfloader_private.h +++ b/src/elfs/elfloader_private.h @@ -206,6 +206,7 @@ elfheader_t* ParseElfHeader32(FILE* f, const char* name, int exec); elfheader_t* ParseElfHeader64(FILE* f, const char* name, int exec); const char* BindSym(int bind); +const char* BindSymFriendly(int bind); uint16_t GetSymbolVersionFlag(elfheader_t* h, int index); diff --git a/src/elfs/elfparser.c b/src/elfs/elfparser.c index c9919123..618b55d0 100644 --- a/src/elfs/elfparser.c +++ b/src/elfs/elfparser.c @@ -409,3 +409,16 @@ const char* BindSym(int bind) sprintf(tmp, "??? 0x%x", bind); return tmp; } + +const char* BindSymFriendly(int bind) +{ + switch(bind) { + case STB_GLOBAL: return "Global"; + case STB_WEAK: return "Weak"; + case STB_LOCAL: return "Local"; + case STB_GNU_UNIQUE: return "Unique"; + } + static char tmp[50]; + sprintf(tmp, "??? 0x%x", bind); + return tmp; +} diff --git a/src/librarian/symbols.c b/src/librarian/symbols.c index d8cbdb31..9ca6810c 100644 --- a/src/librarian/symbols.c +++ b/src/librarian/symbols.c @@ -227,6 +227,7 @@ void AddUniqueSymbol(kh_mapsymbols_t *mapsymbols, const char* name, uintptr_t ad v->syms[idx].sym.offs = addr; v->syms[idx].sym.sz = sz; v->syms[idx].veropt = veropt; + printf_dump(LOG_DEBUG, " Adding unique %s (ver:%d/%s%s) with offert=%p sz=%d\n", name, ver, vername?vername:"(none)", veropt?" veropt":"", (void*)addr, sz); } int GetSymbolStartEnd(kh_mapsymbols_t* mapsymbols, const char* name, uintptr_t* start, uintptr_t* end, int ver, const char* vername, int local, int veropt) |