mirror of
https://github.com/crosstool-ng/crosstool-ng.git
synced 2024-12-19 04:47:52 +00:00
Patch from upstream fixing dlopen from a static app
Signed-off-by: Alexey Neyman <stilor@att.net>
This commit is contained in:
parent
6f226b5efe
commit
7329ea51b4
56
patches/uClibc/0.9.33.2/998-dlopen-static.patch
Normal file
56
patches/uClibc/0.9.33.2/998-dlopen-static.patch
Normal file
@ -0,0 +1,56 @@
|
||||
From 231e4a9b4b972662a6832f714a05525a3754892d Mon Sep 17 00:00:00 2001
|
||||
From: Filippo Arcidiacono <filippo.arcidiacono@st.com>
|
||||
Date: Thu, 9 May 2013 09:04:20 +0200
|
||||
Subject: libdl: fix dlopen implementation from statically linked application
|
||||
|
||||
Calling dlopen from statically linked application is actually broken,
|
||||
because _dl_find_hash enters into an infinite loop when trying to
|
||||
resolve symbols. In this case it doesn't need to extend the global
|
||||
scope, it is readyto be used as it is, because _dl_loaded_modules already points
|
||||
to the dlopened library.
|
||||
|
||||
The patch also fixesi a typo in __LDSO_LD_LIBRARY_PATH__ macro, that was
|
||||
preventing to get the actual value of the LD_LIBRARY_PATH.
|
||||
|
||||
Signed-off-by: Filippo Arcidiacono <filippo.arcidiacono@st.com>
|
||||
Signed-off-by: Carmelo Amoroso <carmelo.amoroso@st.com>
|
||||
---
|
||||
ldso/libdl/libdl.c | 11 +++++++++--
|
||||
1 file changed, 9 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/ldso/libdl/libdl.c b/ldso/libdl/libdl.c
|
||||
index 4630a59..3a78696 100644
|
||||
--- a/ldso/libdl/libdl.c
|
||||
+++ b/ldso/libdl/libdl.c
|
||||
@@ -374,7 +374,7 @@ static void *do_dlopen(const char *libname, int flag, ElfW(Addr) from)
|
||||
if (getenv("LD_BIND_NOW"))
|
||||
now_flag = RTLD_NOW;
|
||||
|
||||
-#if !defined SHARED && defined __LDSO_LIBRARY_PATH__
|
||||
+#if !defined SHARED && defined __LDSO_LD_LIBRARY_PATH__
|
||||
/* When statically linked, the _dl_library_path is not yet initialized */
|
||||
_dl_library_path = getenv("LD_LIBRARY_PATH");
|
||||
#endif
|
||||
@@ -541,11 +541,18 @@ static void *do_dlopen(const char *libname, int flag, ElfW(Addr) from)
|
||||
* to the GOT tables. We need to do this in reverse order so that COPY
|
||||
* directives work correctly */
|
||||
|
||||
- /* Get the tail of the list */
|
||||
+#ifdef SHARED
|
||||
+ /*
|
||||
+ * Get the tail of the list.
|
||||
+ * In the static case doesn't need to extend the global scope, it is
|
||||
+ * ready to be used as it is, because _dl_loaded_modules already points
|
||||
+ * to the dlopened library.
|
||||
+ */
|
||||
for (ls = &_dl_loaded_modules->symbol_scope; ls && ls->next; ls = ls->next);
|
||||
|
||||
/* Extend the global scope by adding the local scope of the dlopened DSO. */
|
||||
ls->next = &dyn_chain->dyn->symbol_scope;
|
||||
+#endif
|
||||
#ifdef __mips__
|
||||
/*
|
||||
* Relocation of the GOT entries for MIPS have to be done
|
||||
--
|
||||
cgit v0.12
|
||||
|
Loading…
Reference in New Issue
Block a user