summaryrefslogtreecommitdiff
path: root/gdb/solib-svr4.c
diff options
context:
space:
mode:
authorGeorge Barrett <bob@bob131.so>2019-12-15 11:12:09 +1100
committerSimon Marchi <simon.marchi@polymtl.ca>2019-12-21 16:02:19 -0500
commitcb7364414157c42de5ea618d98e2be9eff1894ba (patch)
treef07e4e39ad4e8b24a6c63aa560eb7067d77c9e69 /gdb/solib-svr4.c
parent0ea8adde5ddc530772f075873b7d05d4fa29a724 (diff)
downloadbinutils-gdb-cb7364414157c42de5ea618d98e2be9eff1894ba.tar.gz
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.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
index de765576d0b..f0c7769ac2c 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