about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-01-08 19:12:18 +0100
committerptitSeb <sebastien.chev@gmail.com>2022-01-08 19:12:18 +0100
commit1f9db9ef0833998c387a107f53e88612c2a246fa (patch)
tree8efe90d7799a973d84061e4ec3dc8c60e56dd608 /src
parent91e13d35575c441f02d1b4864a707b355a02880b (diff)
downloadbox64-1f9db9ef0833998c387a107f53e88612c2a246fa.tar.gz
box64-1f9db9ef0833998c387a107f53e88612c2a246fa.zip
Another attempt to make the function to find versionned symbol more resiliant
Diffstat (limited to 'src')
-rwxr-xr-xsrc/elfs/elfloader.c17
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);
                 }
             }
         }