diff options
author | George Barrett <bob@bob131.so> | 2019-12-15 11:12:09 +1100 |
---|---|---|
committer | Simon Marchi <simon.marchi@polymtl.ca> | 2019-12-21 16:02:19 -0500 |
commit | cb7364414157c42de5ea618d98e2be9eff1894ba (patch) | |
tree | f07e4e39ad4e8b24a6c63aa560eb7067d77c9e69 /gdb/solib-svr4.c | |
parent | 0ea8adde5ddc530772f075873b7d05d4fa29a724 (diff) | |
download | gdb-cb7364414157c42de5ea618d98e2be9eff1894ba.zip gdb-cb7364414157c42de5ea618d98e2be9eff1894ba.tar.gz gdb-cb7364414157c42de5ea618d98e2be9eff1894ba.tar.bz2 |
Fix disabling of solib probes when LD_AUDITing
The SVR4 solib event handler determines whether an event is related to a
non-base link namespace by comparing the event's debug struct address
to the debug struct address of the initial program image. However, this
can fail when using LD_AUDIT as audit libraries are loaded before the
loader has initialised the initial program image's debug struct. When
the event handler fails to find the debug struct, the probe-based
debugger interface is disabled and a warning is flagged to the user.
This commit adds a fallback test to help determine whether an event is
for a foreign link namespace when the debug struct isn't available.
gdb/ChangeLog:
2019-12-15 George Barrett <bob@bob131.so>
* solib-svr4.c (svr4_handle_solib_event): Add fallback link
namespace test for when the debug struct isn't available.
Diffstat (limited to 'gdb/solib-svr4.c')
-rw-r--r-- | gdb/solib-svr4.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index de76557..f0c7769 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -1942,7 +1942,27 @@ svr4_handle_solib_event (void) /* Always locate the debug struct, in case it moved. */ info->debug_base = 0; if (locate_base (info) == 0) - return; + { + /* It's possible for the reloc_complete probe to be triggered before + the linker has set the DT_DEBUG pointer (for example, when the + linker has finished relocating an LD_AUDIT library or its + dependencies). Since we can't yet handle libraries from other link + namespaces, we don't lose anything by ignoring them here. */ + struct value *link_map_id_val; + try + { + link_map_id_val = pa->prob->evaluate_argument (0, frame); + } + catch (const gdb_exception_error) + { + link_map_id_val = NULL; + } + /* glibc and illumos' libc both define LM_ID_BASE as zero. */ + if (link_map_id_val != NULL && value_as_long (link_map_id_val) != 0) + action = DO_NOTHING; + else + return; + } /* GDB does not currently support libraries loaded via dlmopen into namespaces other than the initial one. We must ignore |