Message ID | 20200626193228.1953-3-danielwa@cisco.com |
---|---|
State | New |
Headers | show |
Series | implement dlmopen hooks for gdb | expand |
diff --git a/elf/dl-open.c b/elf/dl-open.c index 9b3606c491..cfef39ec53 100644 --- a/elf/dl-open.c +++ b/elf/dl-open.c @@ -542,7 +542,9 @@ dl_open_worker (void *a) ++new->l_direct_opencount; /* It was already open. */ - if (__glibc_unlikely (new->l_searchlist.r_list != NULL)) + if (__glibc_unlikely (new->l_searchlist.r_list != NULL) || + (__glibc_unlikely (mode & RTLD_NOLOAD) && + __glibc_unlikely (!(mode & RTLD_GLOBAL)))) { /* Let the user know about the opencount. */ if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
From: Conan C Huang <conhuang@cisco.com> This is a fix for GLIBC Bugzilla #25615: dlopen RTLD_NOLOAD optimization When dlopen with RTLD_NOLOAD flag, loader should simply return the link_map or NULL and promote flags like RTLD_GLOBAL and RTLD_NODELETE. Loader shouldn't need to process any dependencies. In dl_open_worker, loader should avoid calling _dl_map_object_deps. _dl_map_object_deps is very time consuming on low-end platforms with lots of library dependencies. Loader retrains the same functionality during flag promotions: RTLD_GLOBAL RTLD_NODELETE https://sourceware.org/bugzilla/show_bug.cgi?id=25615 --- elf/dl-open.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)