about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-09-14 16:45:44 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-09-14 16:45:44 +0200
commite5ad7c36ecba49d39150530f792cf3be4d122df1 (patch)
treec8cca8ac272ce0725465457d0e197b478b43f455 /src
parent3b8ba5dfa645e267fe6a949985f1e2acdb61b2d4 (diff)
downloadbox64-e5ad7c36ecba49d39150530f792cf3be4d122df1.tar.gz
box64-e5ad7c36ecba49d39150530f792cf3be4d122df1.zip
[BOX32][ELFLOADER] Fixed some issue with symbol resolver
Diffstat (limited to 'src')
-rw-r--r--src/elfs/elfloader32.c33
-rw-r--r--src/elfs/elfloader_private.h1
-rw-r--r--src/elfs/elfparser.c13
-rw-r--r--src/librarian/symbols.c1
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)