[PATCH] Allow use of executable RPATH/RUNPATH when finding libraries.

Steve Ellcey <[email protected]>
Newsgroups gmane.comp.lib.uclibc.general
Message-ID <[email protected]>
This option will modify ldso so that it will 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.

Signed-off-by: Steve Ellcey <[email protected]>
---
 extra/Configs/Config.in |    9 +++++++++
 ldso/ldso/dl-elf.c      |   12 ++++++++++++
 2 files changed, 21 insertions(+)

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__
-- 
1.7.9.5
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.