about summary refs log tree commit diff stats
path: root/src/elfs/elfparser.c
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-11-01 10:37:44 +0100
committerptitSeb <sebastien.chev@gmail.com>2022-11-01 10:37:44 +0100
commit24cc0c8422f4917fc8d0d03044d930ee91163674 (patch)
treeaa36455ad4889d1d1a72cc7fd27e256d7e375c64 /src/elfs/elfparser.c
parent8459ea0d31a851e847318273233c9a8b2b079eae (diff)
downloadbox64-24cc0c8422f4917fc8d0d03044d930ee91163674.tar.gz
box64-24cc0c8422f4917fc8d0d03044d930ee91163674.zip
Detect when program is linked with glibc 2.34+ to workaround the default libc libs to load
Diffstat (limited to 'src/elfs/elfparser.c')
-rwxr-xr-xsrc/elfs/elfparser.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/elfs/elfparser.c b/src/elfs/elfparser.c
index 9607efd9..1fd3ca01 100755
--- a/src/elfs/elfparser.c
+++ b/src/elfs/elfparser.c
@@ -407,3 +407,31 @@ const char* GetParentSymbolVersion(elfheader_t* h, int index)
     }
     return NULL;
 }
+
+int GetVersionIndice(elfheader_t* h, const char* vername)
+{
+    if(!vername)
+        return 0;
+    if(h->VerNeed) {
+        Elf64_Verneed *ver = (Elf64_Verneed*)((uintptr_t)h->VerNeed + h->delta);
+        while(ver) {
+            Elf64_Vernaux *aux = (Elf64_Vernaux*)((uintptr_t)ver + ver->vn_aux);
+            for(int j=0; j<ver->vn_cnt; ++j) {
+                if(!strcmp(h->DynStr+aux->vna_name, vername)) 
+                    return aux->vna_other;
+                aux = (Elf64_Vernaux*)((uintptr_t)aux + aux->vna_next);
+            }
+            ver = ver->vn_next?((Elf64_Verneed*)((uintptr_t)ver + ver->vn_next)):NULL;
+        }
+    }
+    if(h->VerDef) {
+        Elf64_Verdef *def = (Elf64_Verdef*)((uintptr_t)h->VerDef + h->delta);
+        while(def) {
+            Elf64_Verdaux *aux = (Elf64_Verdaux*)((uintptr_t)def + def->vd_aux);
+            if(!strcmp(h->DynStr+aux->vda_name, vername))
+                return def->vd_ndx;
+            def = def->vd_next?((Elf64_Verdef*)((uintptr_t)def + def->vd_next)):NULL;
+        }
+    }
+    return 0;
+}
\ No newline at end of file