summaryrefslogtreecommitdiff
path: root/rts/Linker.c
diff options
context:
space:
mode:
authorAustin Seipp <austin@well-typed.com>2014-06-30 07:44:31 -0500
committerAustin Seipp <austin@well-typed.com>2014-06-30 07:44:31 -0500
commitaed1723f97e0539d5ab35222b180c1552a5f4cfc (patch)
treeae3ba54bf08fcef95eadbcf3910ad2f8613df764 /rts/Linker.c
parentabeb2bbc5f2237783476d53f44e5b7e6490c4e7e (diff)
downloadhaskell-aed1723f97e0539d5ab35222b180c1552a5f4cfc.tar.gz
Revert "Fix obscure problem with using the system linker (#8935)"
This reverts commit 2f8b4c9330b455d4cb31c186c747a7db12a69251. Signed-off-by: Austin Seipp <austin@well-typed.com>
Diffstat (limited to 'rts/Linker.c')
-rw-r--r--rts/Linker.c43
1 files changed, 9 insertions, 34 deletions
diff --git a/rts/Linker.c b/rts/Linker.c
index f7f554ce6c..e5e61bb49a 100644
--- a/rts/Linker.c
+++ b/rts/Linker.c
@@ -1798,7 +1798,7 @@ internal_dlopen(const char *dll_name)
// (see POSIX also)
ACQUIRE_LOCK(&dl_mutex);
- hdl = dlopen(dll_name, RTLD_LAZY|RTLD_LOCAL); /* see Note [RTLD_LOCAL] */
+ hdl = dlopen(dll_name, RTLD_LAZY | RTLD_GLOBAL);
errmsg = NULL;
if (hdl == NULL) {
@@ -1808,12 +1808,11 @@ internal_dlopen(const char *dll_name)
errmsg_copy = stgMallocBytes(strlen(errmsg)+1, "addDLL");
strcpy(errmsg_copy, errmsg);
errmsg = errmsg_copy;
- } else {
- o_so = stgMallocBytes(sizeof(OpenedSO), "addDLL");
- o_so->handle = hdl;
- o_so->next = openedSOs;
- openedSOs = o_so;
}
+ o_so = stgMallocBytes(sizeof(OpenedSO), "addDLL");
+ o_so->handle = hdl;
+ o_so->next = openedSOs;
+ openedSOs = o_so;
RELEASE_LOCK(&dl_mutex);
//--------------- End critical section -------------------
@@ -1821,39 +1820,14 @@ internal_dlopen(const char *dll_name)
return errmsg;
}
-/*
- Note [RTLD_LOCAL]
-
- In GHCi we want to be able to override previous .so's with newly
- loaded .so's when we recompile something. This further implies that
- when we look up a symbol in internal_dlsym() we have to iterate
- through the loaded libraries (in order from most recently loaded to
- oldest) looking up the symbol in each one until we find it.
-
- However, this can cause problems for some symbols that are copied
- by the linker into the executable image at runtime - see #8935 for a
- lengthy discussion. To solve that problem we need to look up
- symbols in the main executable *first*, before attempting to look
- them up in the loaded .so's. But in order to make that work, we
- have to always call dlopen with RTLD_LOCAL, so that the loaded
- libraries don't populate the global symbol table.
-*/
-
static void *
-internal_dlsym(const char *symbol) {
+internal_dlsym(void *hdl, const char *symbol) {
OpenedSO* o_so;
void *v;
// We acquire dl_mutex as concurrent dl* calls may alter dlerror
ACQUIRE_LOCK(&dl_mutex);
dlerror();
- // look in program first
- v = dlsym(dl_prog_handle, symbol);
- if (dlerror() == NULL) {
- RELEASE_LOCK(&dl_mutex);
- return v;
- }
-
for (o_so = openedSOs; o_so != NULL; o_so = o_so->next) {
v = dlsym(o_so->handle, symbol);
if (dlerror() == NULL) {
@@ -1861,6 +1835,7 @@ internal_dlsym(const char *symbol) {
return v;
}
}
+ v = dlsym(hdl, symbol);
RELEASE_LOCK(&dl_mutex);
return v;
}
@@ -2028,7 +2003,7 @@ lookupSymbol( char *lbl )
if (!ghciLookupSymbolTable(symhash, lbl, &val)) {
IF_DEBUG(linker, debugBelch("lookupSymbol: symbol not found\n"));
# if defined(OBJFORMAT_ELF)
- return internal_dlsym(lbl);
+ return internal_dlsym(dl_prog_handle, lbl);
# elif defined(OBJFORMAT_MACHO)
# if HAVE_DLFCN_H
/* On OS X 10.3 and later, we use dlsym instead of the old legacy
@@ -2042,7 +2017,7 @@ lookupSymbol( char *lbl )
*/
IF_DEBUG(linker, debugBelch("lookupSymbol: looking up %s with dlsym\n", lbl));
ASSERT(lbl[0] == '_');
- return internal_dlsym(lbl + 1);
+ return internal_dlsym(dl_prog_handle, lbl + 1);
# else
if (NSIsSymbolNameDefined(lbl)) {
NSSymbol symbol = NSLookupAndBindSymbol(lbl);