Delay checking whether /proc/pid/mem is writable (PR gdb/29907)

As of 1bcb0708f229 ("gdb/linux-nat: Check whether /proc/pid/mem is
writable"), GDB checks if /proc/pid/mem is writable.  This is done
early at GDB startup, in order to get a consistent warning, instead of
a warning that depends on whenever GDB writes to inferior memory.

PR gdb/29907 points out that some build systems (like QEMU's,
apparently) may call 'gdb --version' to check GDB's presence & its
version on the system, and that Gentoo's build process has sandboxing
which blocks the /proc/pid/mem access and thus GDB warns, which
results in build fails.

To help with that, this patch delays the /proc/pid/mem check until we
start or attach to an inferior.  Ends up potentially emiting a warning
close where we already emit other ptrace- and /proc- related warnings,
which just Feels Right.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29907
Change-Id: I5537653ecfbbe76a04ab035e40e59d09b4980763
This commit is contained in:
Pedro Alves 2022-12-16 12:04:54 +00:00
parent c7ce51d8c8
commit 9dff6a5d54

View File

@ -372,6 +372,7 @@ linux_init_ptrace_procfs (pid_t pid, int attached)
linux_enable_event_reporting (pid, options);
linux_ptrace_init_warnings ();
linux_proc_init_warnings ();
proc_mem_file_is_writable ();
}
linux_nat_target::~linux_nat_target ()
@ -3955,7 +3956,11 @@ linux_proc_xfer_memory_partial (int pid, gdb_byte *readbuf,
return true if so. It wasn't writable before Linux 2.6.39, but
there's no way to know whether the feature was backported to older
kernels. So we check to see if it works. The result is cached,
and this is garanteed to be called once early at startup. */
and this is garanteed to be called once early during inferior
startup, so that any warning is printed out consistently between
GDB invocations. Note we don't call it during GDB startup instead
though, because then we might warn with e.g. just "gdb --version"
on sandboxed systems. See PR gdb/29907. */
static bool
proc_mem_file_is_writable ()
@ -4490,8 +4495,6 @@ Enables printf debugging output."),
sigemptyset (&blocked_mask);
lwp_lwpid_htab_create ();
proc_mem_file_is_writable ();
}