diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-01-08 19:12:18 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-01-08 19:12:18 +0100 |
| commit | 1f9db9ef0833998c387a107f53e88612c2a246fa (patch) | |
| tree | 8efe90d7799a973d84061e4ec3dc8c60e56dd608 /src | |
| parent | 91e13d35575c441f02d1b4864a707b355a02880b (diff) | |
| download | box64-1f9db9ef0833998c387a107f53e88612c2a246fa.tar.gz box64-1f9db9ef0833998c387a107f53e88612c2a246fa.zip | |
Another attempt to make the function to find versionned symbol more resiliant
Diffstat (limited to 'src')
| -rwxr-xr-x | src/elfs/elfloader.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c index eb10c55a..f1e6f123 100755 --- a/src/elfs/elfloader.c +++ b/src/elfs/elfloader.c @@ -1576,15 +1576,16 @@ int dl_iterate_phdr_findsymbol(struct dl_phdr_info* info, size_t size, void* dat ElfW(Verdef)* v = verdef; for(int k=0; k<verdef_cnt; ++k) { ElfW(Verdaux)* vda = (ElfW(Verdaux)*)(((uintptr_t)v) + v->vd_aux); - for(int i=0; i<v->vd_cnt; ++i) { - const char* vername = &strtab[vda->vda_name]; - if(vername && (s->addr = dlvsym(s->lib, s->name, vername))) { - printf_log(LOG_DEBUG, "Found symbol with version %s, value = %p\n", vername, s->addr); - return 1; // stop searching + if(v->vd_version>0 && !v->vd_flags) + for(int i=0; i<v->vd_cnt; ++i) { + const char* vername = &strtab[vda->vda_name]; + if(vername && (s->addr = dlvsym(s->lib, s->name, vername))) { + printf_log(LOG_DEBUG, "Found symbol with version %s, value = %p\n", vername, s->addr); + return 1; // stop searching + } + vda = (ElfW(Verdaux)*)(((uintptr_t)vda) + vda->vda_next); } - vda = (ElfW(Verdaux)*)(((uintptr_t)vda) + vda->vda_next); - } - v = (ElfW(Verdef)*)((uintptr_t)v + v->vd_next); + v = (ElfW(Verdef)*)((uintptr_t)v + v->vd_next); } } } |