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.
This commit is contained in:
George Barrett 2019-12-15 11:12:09 +11:00 committed by Simon Marchi
parent 0ea8adde5d
commit cb73644141
2 changed files with 26 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2019-12-21 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.
2019-12-21 Eli Zaretskii <eliz@gnu.org>
* top.c (print_gdb_configuration): Print "--with-xxhash" or

View File

@ -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