about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rwxr-xr-xsrc/elfs/elfloader.c6
-rwxr-xr-xsrc/elfs/elfloader_private.h1
-rwxr-xr-xsrc/librarian/library.c5
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);