Re: executable RPATH question
Steve Ellcey <[email protected]>
| Newsgroups | gmane.comp.lib.uclibc.general |
|---|---|
| Message-ID | <1423256191.27046.7.camel@ubuntu-sellcey> |
On Fri, 2015-02-06 at 08:23 +0100, Waldemar Brodkorb wrote: > Hi Steve, > > > > Original discussion: > > > > http://lists.uclibc.org/pipermail/uclibc/2011-September/045757.html > > Do you have a patch which applies to master? > Including an option... > > best regards > Waldemar Here is a patch that I came up with the includes an option (off by default). Steve Ellcey [email protected] _______________________________________________ uClibc mailing list [email protected] http://lists.busybox.net/mailman/listinfo/uclibc
uclibc_ldso.patch
(text/x-patch, 1.6 KB)
diff --git a/extra/Configs/Config.in b/extra/Configs/Config.in
index 8e603b2..a235c3d 100644
--- a/extra/Configs/Config.in
+++ b/extra/Configs/Config.in
@@ -418,6 +418,15 @@ config LDSO_RUNPATH
Usage of RUNPATH tags is not too common, so disabling this feature
should be safe for most people.
+config LDSO_RUNPATH_OF_EXECUTABLE
+ bool "Use executables RPATH/RUNPATH when searching for libraries."
+ depends on LDSO_RUNPATH
+ default n
+ help
+ Use the executables RPATH/RUNPATH to find to find libraries even
+ though this behavour is not standard. Setting this option causes
+ the uclibc dynamic linker behavour to match the glibc dynamic linker.
+
config LDSO_SAFE_RUNPATH
bool "Allow only RUNPATH beginning with /"
depends on LDSO_RUNPATH
diff --git a/ldso/ldso/dl-elf.c b/ldso/ldso/dl-elf.c
index 54501d1..56076b6 100644
--- a/ldso/ldso/dl-elf.c
+++ b/ldso/ldso/dl-elf.c
@@ -237,6 +237,18 @@ struct elf_resolve *_dl_load_shared_library(unsigned rflags, struct dyn_elf **rp
if ((tpnt1 = search_for_named_library(libname, rflags, pnt, rpnt)) != NULL)
return tpnt1;
}
+#ifdef __LDSO_RUNPATH_OF_EXECUTABLE__
+ /*
+ * Try the DT_RPATH of the executable itself.
+ */
+ pnt = (char *) _dl_loaded_modules->dynamic_info[DT_RPATH];
+ if (pnt) {
+ pnt += (unsigned long) _dl_loaded_modules->dynamic_info[DT_STRTAB];
+ _dl_if_debug_dprint("\tsearching exe's RPATH='%s'\n", pnt);
+ if ((tpnt1 = search_for_named_library(libname, rflags, pnt, rpnt)) != NULL)
+ return tpnt1;
+ }
+#endif
#endif
#ifdef __LDSO_LD_LIBRARY_PATH__