From 73d7af4f4c2b394063cb0b3a33ee2b00b5ad80b4 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sat, 13 Aug 2011 22:24:08 -0400 Subject: Implement LD_DEBUG=scopes --- ChangeLog | 8 ++++++ elf/dl-open.c | 65 ++++++++++++++++++++++------------------------ elf/rtld.c | 16 ++++++++++-- sysdeps/generic/ldsodefs.h | 8 ++++-- 4 files changed, 59 insertions(+), 38 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8d2f204dcf..6d543f6263 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2011-08-13 Ulrich Drepper + * elf/dl-open.c: Rename show_scope to _dl_schow_scope and export. + (dl_open_worker): Call _dl_show_scope when DL_DEBUG_SCOPES is set. + * elf/rtld.c (dl_main): Set l_name of vDSO. + Call _dl_show_scope when DL_DEBUG_SCOPES. + (process_dl_debug): Recognize scopes flag and also set it for all. + * sysdeps/generic/ldsodefs.h: Define DL_DEBUG_SCOPES. + Declare _dl_show_scope. + * elf/dl-libc.c (do_dlopen_args): Add caller_dlopen. (do_dlopen): Pass caller_dlopen to dl_open. (__libc_dlopen_mode): Initialize caller_dlopen. diff --git a/elf/dl-open.c b/elf/dl-open.c index 19fda917f3..c3e5fbaea7 100644 --- a/elf/dl-open.c +++ b/elf/dl-open.c @@ -46,12 +46,6 @@ weak_extern (BP_SYM (_dl_sysdep_start)) extern int __libc_multiple_libcs; /* Defined in init-first.c. */ -/* Undefine the following for debugging. */ -/* #define SCOPE_DEBUG 1 */ -#ifdef SCOPE_DEBUG -static void show_scope (struct link_map *new); -#endif - /* We must be carefull not to leave us in an inconsistent state. Thus we catch any error and re-raise it after cleaning up. */ @@ -269,10 +263,6 @@ dl_open_worker (void *a) (void) _dl_check_map_versions (new->l_searchlist.r_list[i]->l_real, 0, 0); -#ifdef SCOPE_DEBUG - show_scope (new); -#endif - #ifdef SHARED /* Auditing checkpoint: we have added all objects. */ if (__builtin_expect (GLRO(dl_naudit) > 0, 0)) @@ -414,6 +404,10 @@ dl_open_worker (void *a) imap->l_scope[cnt + 1] = NULL; atomic_write_barrier (); imap->l_scope[cnt] = &new->l_searchlist; + + /* Print scope information. */ + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_SCOPES, 0)) + _dl_show_scope (imap); } /* Only add TLS memory if this object is loaded now and therefore is not yet initialized. */ @@ -499,6 +493,10 @@ cannot load any more object with static TLS")); if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_FILES, 0)) _dl_debug_printf ("opening file=%s [%lu]; direct_opencount=%u\n\n", new->l_name, new->l_ns, new->l_direct_opencount); + + /* Print scope information. */ + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_SCOPES, 0)) + _dl_show_scope (new); } @@ -635,33 +633,32 @@ no more namespaces available for dlmopen()")); } -#ifdef SCOPE_DEBUG -#include - -static void -show_scope (struct link_map *new) +void +_dl_show_scope (struct link_map *l) { - int scope_cnt; - - for (scope_cnt = 0; new->l_scope[scope_cnt] != NULL; ++scope_cnt) - { - char numbuf[2]; - unsigned int cnt; - - numbuf[0] = '0' + scope_cnt; - numbuf[1] = '\0'; - _dl_printf ("scope %s:", numbuf); - - for (cnt = 0; cnt < new->l_scope[scope_cnt]->r_nlist; ++cnt) - if (*new->l_scope[scope_cnt]->r_list[cnt]->l_name) - _dl_printf (" %s", new->l_scope[scope_cnt]->r_list[cnt]->l_name); - else - _dl_printf ("
"); + _dl_debug_printf ("object=%s [%lu]\n", + *l->l_name ? l->l_name : rtld_progname, l->l_ns); + if (l->l_scope != NULL) + for (int scope_cnt = 0; l->l_scope[scope_cnt] != NULL; ++scope_cnt) + { + char numbuf[2]; + unsigned int cnt; + + numbuf[0] = '0' + scope_cnt; + numbuf[1] = '\0'; + _dl_debug_printf (" scope %s:", numbuf); + + for (cnt = 0; cnt < l->l_scope[scope_cnt]->r_nlist; ++cnt) + if (*l->l_scope[scope_cnt]->r_list[cnt]->l_name) + _dl_debug_printf_c (" %s", + l->l_scope[scope_cnt]->r_list[cnt]->l_name); + else + _dl_debug_printf_c (" %s", rtld_progname); - _dl_printf ("\n"); - } + _dl_debug_printf_c ("\n"); + } + _dl_debug_printf ("\n"); } -#endif #ifdef IS_IN_rtld /* Return non-zero if ADDR lies within one of L's segments. */ diff --git a/elf/rtld.c b/elf/rtld.c index 9eb9289ead..b84a3e7a34 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -1391,7 +1391,7 @@ of this helper program; chances are you did not intend to run this program.\n\ char *copy = malloc (len); if (copy == NULL) _dl_fatal_printf ("out of memory\n"); - l->l_libname->name = memcpy (copy, dsoname, len); + l->l_name = l->l_libname->name = memcpy (copy, dsoname, len); } /* Add the vDSO to the object list. */ @@ -2191,6 +2191,15 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n", malloc will no longer be the one from dl-minimal.c. */ GLRO(dl_init_all_dirs) = GL(dl_all_dirs); + /* Print scope information. */ + if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_SCOPES, 0)) + { + _dl_debug_printf ("\nInitial object scopes\n"); + + for (struct link_map *l = main_map; l != NULL; l = l->l_next) + _dl_show_scope (l); + } + if (prelinked) { if (main_map->l_info [ADDRIDX (DT_GNU_CONFLICT)] != NULL) @@ -2431,9 +2440,12 @@ process_dl_debug (const char *dl_debug) DL_DEBUG_BINDINGS | DL_DEBUG_IMPCALLS }, { LEN_AND_STR ("versions"), "display version dependencies", DL_DEBUG_VERSIONS | DL_DEBUG_IMPCALLS }, + { LEN_AND_STR ("scopes"), "display scope information", + DL_DEBUG_SCOPES }, { LEN_AND_STR ("all"), "all previous options combined", DL_DEBUG_LIBS | DL_DEBUG_RELOC | DL_DEBUG_FILES | DL_DEBUG_SYMBOLS - | DL_DEBUG_BINDINGS | DL_DEBUG_VERSIONS | DL_DEBUG_IMPCALLS }, + | DL_DEBUG_BINDINGS | DL_DEBUG_VERSIONS | DL_DEBUG_IMPCALLS + | DL_DEBUG_SCOPES }, { LEN_AND_STR ("statistics"), "display relocation statistics", DL_DEBUG_STATISTICS }, { LEN_AND_STR ("unused"), "determined unused DSOs", diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h index 26c74f6ce0..a5f0a25ccc 100644 --- a/sysdeps/generic/ldsodefs.h +++ b/sysdeps/generic/ldsodefs.h @@ -556,9 +556,10 @@ struct rtld_global_ro #define DL_DEBUG_FILES (1 << 6) #define DL_DEBUG_STATISTICS (1 << 7) #define DL_DEBUG_UNUSED (1 << 8) +#define DL_DEBUG_SCOPES (1 << 9) /* These two are used only internally. */ -#define DL_DEBUG_HELP (1 << 9) -#define DL_DEBUG_PRELINK (1 << 10) +#define DL_DEBUG_HELP (1 << 10) +#define DL_DEBUG_PRELINK (1 << 11) /* OS version. */ EXTERN unsigned int _dl_osversion; @@ -1104,6 +1105,9 @@ extern void *_dl_tls_get_addr_soft (struct link_map *l) attribute_hidden; extern int _dl_addr_inside_object (struct link_map *l, const ElfW(Addr) addr) internal_function attribute_hidden; +/* Show show of an object. */ +extern void _dl_show_scope (struct link_map *new); + __END_DECLS #endif /* ldsodefs.h */ -- cgit v1.2.3