EP-F6AA0618C49C4AEDA73BFF1B39950BAB

Hi,

Subject: [PATCH 1/1] bugifx for soname mismatch

As per my understanding, this issue needs to be fixed in loader, But if can not 
be fixed 
then there is work around for following issue.

Issue case:-
1. Create a library libB.so having soname libB.so
2. At compile time we linked libB.so to binary, and thus in NEEDED section it 
will show libB.so
        gcc test.c -o test -lB
3. Now create a softlink as below:-
        ln -sf libA.so libB.so
        (libB.so -> libA.so)
4. No when we do prelink, Library list section '.gnu.liblist' contains  entries 
as below:
        0: libA.so              2014-12-02T04:28:40 0x95c929e5 0       0 
//SONAME
5. And at run time prelink will be failed because of dependency mismatch due to 
soname issue.
        expect libA.so, found /lib/libB.so in dependency order
        prelink checking: failed
        
Issue is prelink fills soname in gnu.liblist section but loader uses filename 
not soname.So we
created a workaround for this issue.

To use filename instead of soname in gnu.liblist
Usage :./prelink -s or ./prelink --ignore-soname


Signed-off-by: Maninder Singh <maninder...@samsung.com>
Signed-off-by: Vaneet Narang <v.nar...@samsung.com>
Reviewed-by: Ajeet Yadav <ajee...@samsung.com>
Reviewed-by: Geon-ho Kim <gh007....@samsung.com>
---
 src/get.c     |    2 ++
 src/main.c    |    5 +++++
 src/prelink.h |    1 +
 3 files changed, 8 insertions(+), 0 deletions(-)

diff --git a/src/get.c b/src/get.c
index ffefe73..bb01331 100644
--- a/src/get.c
+++ b/src/get.c
@@ -182,6 +182,8 @@ prelink_record_relocations (struct prelink_info *info, FILE 
*f,
                }
            }
        }
+      if(ignore_soname) 
+          soname = strrchr(filename, '/') + 1;
 
       if (! tdeps)
        deps[0].ent = info->ent;
diff --git a/src/main.c b/src/main.c
index 15c1d53..5891dbc 100644
--- a/src/main.c
+++ b/src/main.c
@@ -61,6 +61,7 @@ const char *prelink_cache = PRELINK_CACHE;
 const char *undo_output;
 int noreexecinit;
 time_t initctime;
+int ignore_soname = 0;
 
 const char *argp_program_version = PRELINK_PROG PKGVERSION " 1.0";
 
@@ -123,6 +124,7 @@ static struct argp_option options[] = {
   {"rtld",             OPT_RTLD, "RTLD", OPTION_HIDDEN, "" },
   {"init",             'i', 0, 0,  "Do not re-execute init" },
   {"allow-textrel",    OPT_ALLOW_TEXTREL, 0, 0, "Allow text relocations even 
on architectures where they may not work" },
+  {"ignore-soname",    's', 0, 0,  "To use filename instead of soname in 
gnu.liblist" },
   { 0 }
 };
 
@@ -250,6 +252,9 @@ parse_opt (int key, char *arg, struct argp_state *state)
     case OPT_ALLOW_TEXTREL:
       allow_bad_textrel = 1;
       break;
+    case 's':
+      ignore_soname = 1;
+      break; 
     default:
       return ARGP_ERR_UNKNOWN;
     }
diff --git a/src/prelink.h b/src/prelink.h
index 66aba99..778e67a 100644
--- a/src/prelink.h
+++ b/src/prelink.h
@@ -597,6 +597,7 @@ extern enum verify_method_t verify_method;
 extern int quick;
 extern long long seed;
 extern GElf_Addr mmap_reg_start, mmap_reg_end, layout_page_size;
+extern int ignore_soname;
 
 extern const char *sysroot;
 
-- 
1.7.1


Thanks 
Maninder Singh
-- 
_______________________________________________
yocto mailing list
yocto@yoctoproject.org
https://lists.yoctoproject.org/listinfo/yocto

Reply via email to