diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-11-01 10:37:44 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-11-01 10:37:44 +0100 |
| commit | 24cc0c8422f4917fc8d0d03044d930ee91163674 (patch) | |
| tree | aa36455ad4889d1d1a72cc7fd27e256d7e375c64 /src/elfs/elfparser.c | |
| parent | 8459ea0d31a851e847318273233c9a8b2b079eae (diff) | |
| download | box64-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-x | src/elfs/elfparser.c | 28 |
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 |