From cb7364414157c42de5ea618d98e2be9eff1894ba Mon Sep 17 00:00:00 2001 From: George Barrett Date: Sun, 15 Dec 2019 11:12:09 +1100 Subject: 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 * solib-svr4.c (svr4_handle_solib_event): Add fallback link namespace test for when the debug struct isn't available. --- gdb/ChangeLog | 5 +++++ gdb/solib-svr4.c | 22 +++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0ba175a..acf9106 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2019-12-21 George Barrett + + * solib-svr4.c (svr4_handle_solib_event): Add fallback link + namespace test for when the debug struct isn't available. + 2019-12-21 Eli Zaretskii * top.c (print_gdb_configuration): Print "--with-xxhash" or 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 -- cgit v1.1