diff --git a/gdb/nat/linux-procfs.c b/gdb/nat/linux-procfs.c index 6be3a26f252..b17e3120792 100644 --- a/gdb/nat/linux-procfs.c +++ b/gdb/nat/linux-procfs.c @@ -352,6 +352,11 @@ linux_proc_pid_to_exec_file (int pid) else buf[len] = '\0'; + /* Use /proc/PID/exe if the actual file can't be read, but /proc/PID/exe + can be. */ + if (access (buf, R_OK) != 0 && access (name, R_OK) == 0) + strcpy (buf, name); + return buf; } diff --git a/gdb/testsuite/gdb.base/attach-deleted-exec.c b/gdb/testsuite/gdb.base/attach-deleted-exec.c new file mode 100644 index 00000000000..ebfae87fbfb --- /dev/null +++ b/gdb/testsuite/gdb.base/attach-deleted-exec.c @@ -0,0 +1,29 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2024 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +int +main () +{ + alarm (60); + + while (1) + usleep (100000); + + return 0; +} diff --git a/gdb/testsuite/gdb.base/attach-deleted-exec.exp b/gdb/testsuite/gdb.base/attach-deleted-exec.exp new file mode 100644 index 00000000000..3e31c36bcc4 --- /dev/null +++ b/gdb/testsuite/gdb.base/attach-deleted-exec.exp @@ -0,0 +1,53 @@ +# Copyright (C) 2024 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Attach to a process, the executable for which has been deleted. On +# GNU/Linux GDB will spot the missing executable and fallback to use +# /proc/PID/exe instead. + +require can_spawn_for_attach +require {istarget *-linux*} + +standard_testfile + +if { [build_executable "failed to prepare" $testfile $srcfile] } { + return -1 +} + +set test_spawn_id [spawn_wait_for_attach $binfile] +set testpid [spawn_id_get_pid $test_spawn_id] + +# Move the executable rather than deleting it. This just to aid with +# debugging if someone needs to reproduce this test. +set binfile_moved ${binfile}_moved + +# Don't move BINFILE as the kernel will just assign a new name to the +# same inode; and the /proc/PID/exe link will continue to point to the +# renamed inode. +remote_exec host "cp $binfile $binfile_moved" +remote_exec host "rm $binfile" + +# Don't pass the executable when GDB starts. Instead rely on GDB +# finding the executable from the PID we attach too. +clean_restart + +# Attach. GDB should spot that the executable is gone and fallback to +# use /proc/PID/exe. +gdb_test "attach $testpid" \ + "Attaching to process $decimal\r\nReading symbols from /proc/${testpid}/exe\\.\\.\\..*" \ + "attach to process with deleted executable" + +# Cleanup. +kill_wait_spawned_process $test_spawn_id diff --git a/gdb/testsuite/gdb.server/connect-with-no-symbol-file.exp b/gdb/testsuite/gdb.server/connect-with-no-symbol-file.exp index 284004abadd..becd94d9f90 100644 --- a/gdb/testsuite/gdb.server/connect-with-no-symbol-file.exp +++ b/gdb/testsuite/gdb.server/connect-with-no-symbol-file.exp @@ -89,6 +89,18 @@ proc connect_no_symbol_file { sysroot action } { } } gdb_assert $ok "connection to GDBserver succeeded" + + # GDB will register /proc/PID/exe as the executable for some of + # these tests. Once the test has finished the inferior will still + # have /proc/PID/exe registered as its executable even though that + # file no longer exists (most likely). GDB will then complain + # about the inferior's executable having disappeared. Silence + # these warnings by removing any registered file from the + # executable. + gdb_test "with confirm off -- file" \ + [multi_line \ + "No executable file now\\." \ + "No symbol file now\\."] } # Make sure we have the original symbol file in a safe place to copy from.