diff options
| -rwxr-xr-x | src/elfs/elfloader.c | 6 | ||||
| -rwxr-xr-x | src/elfs/elfloader_private.h | 1 | ||||
| -rwxr-xr-x | src/librarian/library.c | 5 |
3 files changed, 11 insertions, 1 deletions
diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c index 310bb2f7..e10de870 100755 --- a/src/elfs/elfloader.c +++ b/src/elfs/elfloader.c @@ -1184,9 +1184,13 @@ int LoadNeededLibs(elfheader_t* h, lib_t *maplib, int local, int bindnow, box64c DumpDynamicNeeded(h); int cnt = 0; - for (int i=0; i<h->numDynamic; ++i) + // count the number of needed libs, and also grab soname + for (int i=0; i<h->numDynamic; ++i) { if(h->Dynamic[i].d_tag==DT_NEEDED) ++cnt; + if(h->Dynamic[i].d_tag==DT_SONAME) + h->soname = h->DynStrTab+h->delta+h->Dynamic[i].d_un.d_val; + } h->needed = new_neededlib(cnt); if(h == my_context->elfs[0]) my_context->neededlibs = h->needed; diff --git a/src/elfs/elfloader_private.h b/src/elfs/elfloader_private.h index a6116ad7..fae234df 100755 --- a/src/elfs/elfloader_private.h +++ b/src/elfs/elfloader_private.h @@ -12,6 +12,7 @@ typedef struct kh_defaultversion_s kh_defaultversion_t; struct elfheader_s { char* name; char* path; // Resolved path to file + char* soname; // soname of the elf size_t numPHEntries; Elf64_Phdr *PHEntries; size_t numSHEntries; diff --git a/src/librarian/library.c b/src/librarian/library.c index a74dea23..9b2bb997 100755 --- a/src/librarian/library.c +++ b/src/librarian/library.c @@ -615,11 +615,16 @@ int IsSameLib(library_t* lib, const char* path) if(!strchr(path, '/') || lib->type==LIB_WRAPPED || !lib->path) { if(strcmp(name, lib->name)==0) ret=1; + if(lib->type==LIB_EMULATED && lib->e.elf->soname && !strcmp(lib->e.elf->soname, path)) + ret=1; } else { char rpath[PATH_MAX]; box_realpath(path, rpath); if(!strcmp(rpath, lib->path)) ret=1; + if(lib->type==LIB_EMULATED && lib->e.elf->path && !strcmp(lib->e.elf->path, rpath)) { + ret=1; + } } if(!ret) { int n = NbDot(name); |