diff options
author | Alexander Kabaev <kan@FreeBSD.org> | 2009-06-16 16:38:54 +0000 |
---|---|---|
committer | Alexander Kabaev <kan@FreeBSD.org> | 2009-06-16 16:38:54 +0000 |
commit | 1310f23766bb99cae81e16e1a21960b21888aa94 (patch) | |
tree | e91941ea186edc47d2b7f7a7efbf15485d799383 /libexec/rtld-elf | |
parent | 5d54b264b7329230ef94c7882f56b74a4af0cf8c (diff) | |
download | src-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/rtld-elf')
-rw-r--r-- | libexec/rtld-elf/rtld.c | 10 |
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; |