diff mbox

executable RPATH question

Message ID 1423256191.27046.7.camel@ubuntu-sellcey
State Superseded
Headers show

Commit Message

Steve Ellcey Feb. 6, 2015, 8:56 p.m. UTC
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
sellcey@imgtec.com
diff mbox

Patch

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__