summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Neyman <stilor@att.net>2017-03-14 23:24:14 -0700
committerWaldemar Brodkorb <wbx@openadk.org>2017-03-17 19:20:40 +0100
commit2e4d3492e6627fc9d4c34de104a6ebe6f84ac1e9 (patch)
tree017b5ed2630fd668a4813388c84f75bef95130db
parent6458e8278c9317f8254eeca9aaf86ce60f3a257b (diff)
Search the configured multilib
... before falling back to ld.so installation path (it is not the same - gcc uses /lib/ld-uClibc-x86-64.so.0 for uClibc) or default /lib:/usr/lib. This matches glibc behavior (see trusted-dirs.h generated during glibc build). Signed-off-by: Alexey Neyman <stilor@att.net>
-rw-r--r--ldso/ldso/Makefile.in5
-rw-r--r--ldso/ldso/dl-elf.c14
2 files changed, 19 insertions, 0 deletions
diff --git a/ldso/ldso/Makefile.in b/ldso/ldso/Makefile.in
index 993aeb9d9..320e4488b 100644
--- a/ldso/ldso/Makefile.in
+++ b/ldso/ldso/Makefile.in
@@ -34,6 +34,11 @@ CFLAGS-$(DODEBUG)-ldso/ldso := -O2 -g
CFLAGS-ldso.c := -DLDSO_ELFINTERP=\"$(TARGET_ARCH)/elfinterp.c\"
+# Search non-default multilib directories
+ifneq ($(MULTILIB_DIR),lib)
+CFLAGS-ldso.c += -DLDSO_MULTILIB_DIR=\"$(MULTILIB_DIR)\"
+endif
+
ifeq ($(TARGET_ARCH),arc)
CFLAGS-ldso.c += -mno-long-calls
endif
diff --git a/ldso/ldso/dl-elf.c b/ldso/ldso/dl-elf.c
index a046aeb74..4b3d86e78 100644
--- a/ldso/ldso/dl-elf.c
+++ b/ldso/ldso/dl-elf.c
@@ -307,6 +307,19 @@ struct elf_resolve *_dl_load_shared_library(unsigned int rflags, struct dyn_elf
}
}
#endif
+
+#ifdef LDSO_MULTILIB_DIR
+ /* If multilib directory is selected, search it before falling back to
+ standard lib directories. */
+ _dl_if_debug_dprint("\tsearching multilib lib path list\n");
+ tpnt1 = search_for_named_library(libname, rflags,
+ UCLIBC_RUNTIME_PREFIX LDSO_MULTILIB_DIR ":"
+ UCLIBC_RUNTIME_PREFIX "usr" LDSO_MULTILIB_DIR,
+ rpnt, NULL);
+ if (tpnt1 != NULL)
+ return tpnt1;
+#endif
+
#if defined SHARED && defined __LDSO_SEARCH_INTERP_PATH__
/* Look for libraries wherever the shared library loader
* was installed */
@@ -315,6 +328,7 @@ struct elf_resolve *_dl_load_shared_library(unsigned int rflags, struct dyn_elf
if (tpnt1 != NULL)
return tpnt1;
#endif
+
/* Lastly, search the standard list of paths for the library.
This list must exactly match the list in uClibc/ldso/util/ldd.c */
_dl_if_debug_dprint("\tsearching full lib path list\n");