aboutsummaryrefslogtreecommitdiff
path: root/libexec
diff options
context:
space:
mode:
authorAlexander Kabaev <kan@FreeBSD.org>2009-06-16 16:38:54 +0000
committerAlexander Kabaev <kan@FreeBSD.org>2009-06-16 16:38:54 +0000
commit1310f23766bb99cae81e16e1a21960b21888aa94 (patch)
treee91941ea186edc47d2b7f7a7efbf15485d799383 /libexec
parent5d54b264b7329230ef94c7882f56b74a4af0cf8c (diff)
downloadsrc-1310f23766bb99cae81e16e1a21960b21888aa94.tar.gz
src-1310f23766bb99cae81e16e1a21960b21888aa94.zip
FreeBSD returns main object handle from dlopen(NULL, ...) calls.
dlsym seaches using this handle are expected to look for symbol definitions in all objects loaded at the program start time along with all objects currently in RTLD_GLOBAL scope. Discussed with: kib Reported by: Maho NAKATA MFC after: 2 weeks
Notes
Notes: svn path=/head/; revision=194298
Diffstat (limited to 'libexec')
-rw-r--r--libexec/rtld-elf/rtld.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c
index 40ed6edc3b16..7e4c995d1def 100644
--- a/libexec/rtld-elf/rtld.c
+++ b/libexec/rtld-elf/rtld.c
@@ -2130,6 +2130,16 @@ do_dlsym(void *handle, const char *name, void *retaddr, const Ver_Entry *ve,
/* Search main program and all libraries loaded by it. */
def = symlook_list(name, hash, &list_main, &defobj, ve, flags,
&donelist);
+
+ /*
+ * We do not distinguish between 'main' object an global scope.
+ * If symbol is not defined by objects loaded at startup, continue
+ * search among dynamically loaded objects with RTLD_GLOBAL
+ * scope.
+ */
+ if (def == NULL)
+ def = symlook_list(name, hash, &list_global, &defobj, ve,
+ flags, &donelist);
} else {
Needed_Entry fake;