From d813a12f2042025d3a13b030827f83129effc692 Mon Sep 17 00:00:00 2001 From: Christian Prochaska Date: Wed, 20 Mar 2024 07:16:04 +0100 Subject: [PATCH] tool chain: GDB fixes Fixes #5154 --- repos/ports/ports/gdb.hash | 2 +- .../noux-pkg/gdb/patches/first_inferior.patch | 32 +++- repos/ports/src/noux-pkg/gdb/patches/series | 1 + .../src/noux-pkg/gdb/patches/symlinks.patch | 165 ++++++++++++++++++ 4 files changed, 198 insertions(+), 2 deletions(-) create mode 100644 repos/ports/src/noux-pkg/gdb/patches/symlinks.patch diff --git a/repos/ports/ports/gdb.hash b/repos/ports/ports/gdb.hash index 03cb95926f..03c118caf4 100644 --- a/repos/ports/ports/gdb.hash +++ b/repos/ports/ports/gdb.hash @@ -1 +1 @@ -36e4e6aeceb38f3b5948599a90436d8c42ca2ac1 +dd6adf72605d7e35901267f0c76f3d5138b04b77 diff --git a/repos/ports/src/noux-pkg/gdb/patches/first_inferior.patch b/repos/ports/src/noux-pkg/gdb/patches/first_inferior.patch index ae537c9ac5..8b9aa71b73 100644 --- a/repos/ports/src/noux-pkg/gdb/patches/first_inferior.patch +++ b/repos/ports/src/noux-pkg/gdb/patches/first_inferior.patch @@ -6,8 +6,38 @@ is sent in 'Hg' commands even if no thread is selected, to get the memory map of the correct inferior with the 'info mem' command. +Also, prevent failed assertions on other commands without a selected thread. + +diff --git a/gdb/exec.c b/gdb/exec.c +index ad543c9..9243b22 100644 +--- a/gdb/exec.c ++++ b/gdb/exec.c +@@ -515,6 +515,10 @@ exec_file_attach (const char *filename, int from_tty) + static void + exec_file_command (const char *args, int from_tty) + { ++ /* prevent a failed assertion in 'find_inferior_pid()' */ ++ if (inferior_ptid == null_ptid) ++ error(_("Cannot execute this command without a live selected thread.")); ++ + if (from_tty && target_has_execution () + && !query (_("A program is being debugged already.\n" + "Are you sure you want to change the file? "))) +diff --git a/gdb/infcmd.c b/gdb/infcmd.c +index 0ddc541..021e29f 100644 +--- a/gdb/infcmd.c ++++ b/gdb/infcmd.c +@@ -2924,6 +2924,8 @@ interrupt_command (const char *args, int from_tty) + if (args != nullptr + && startswith (args, "-a")) + all_threads = 1; ++ else ++ ensure_valid_thread(); + + interrupt_target_1 (all_threads); + } diff --git a/gdb/remote.c b/gdb/remote.c -index b5db0c0..f36d4a9 100644 +index 5fccf69..f12d504 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -2908,6 +2908,9 @@ remote_target::set_thread (ptid_t ptid, int gen) diff --git a/repos/ports/src/noux-pkg/gdb/patches/series b/repos/ports/src/noux-pkg/gdb/patches/series index 659a510dd6..82f73aaec8 100644 --- a/repos/ports/src/noux-pkg/gdb/patches/series +++ b/repos/ports/src/noux-pkg/gdb/patches/series @@ -8,3 +8,4 @@ call_dummy_location.patch non_stop.patch memory_map.patch first_inferior.patch +symlinks.patch diff --git a/repos/ports/src/noux-pkg/gdb/patches/symlinks.patch b/repos/ports/src/noux-pkg/gdb/patches/symlinks.patch new file mode 100644 index 0000000000..28bb714261 --- /dev/null +++ b/repos/ports/src/noux-pkg/gdb/patches/symlinks.patch @@ -0,0 +1,165 @@ +symlinks.patch + +From: Tom Tromey +Date: Wed, 6 Apr 2022 13:17:10 -0600 + +Currently gdb uses realpath when finding an objfile. However, this +yields surprising results when the given name is a symlink -- if the +symlink is retargeted, re-running will not cause a change. + +This patch fixes the problem by changing gdb to compute the absolute +path rather than the real path. + +This area has some history. PR gdb/15415 changed this area to try to +preserve the basename of the executable, so that programs that check +argv[0] will continue to work correctly. + +There's also PR gdb/15934, which proposes preserving the original name +for use in argv[0] and in "info inferior". I haven't done this. The +"info inferior" part might not be too difficult (unsure) but I wasn't +sure how argv[0] could really be preserved given relative file names, +the use of shell to startup, and the user's ability to change gdb's +working directory. + +I think this patch does fix PR symtab/24143, which concerns finding +separate debug files when symlinks are used. The included test does +not test exactly this scenario, though. + +Regression tested on x86-64 Fedora 34. + +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=24143 +--- + gdb/exec.c | 14 ++------ + gdb/symfile.c | 2 + + gdb/testsuite/gdb.base/symlink-exe.exp | 57 ++++++++++++++++++++++++++++++++ + 3 files changed, 62 insertions(+), 11 deletions(-) + create mode 100644 gdb/testsuite/gdb.base/symlink-exe.exp + +diff --git a/gdb/exec.c b/gdb/exec.c +index 9243b22..b01b121 100644 +--- a/gdb/exec.c ++++ b/gdb/exec.c +@@ -385,7 +385,7 @@ exec_file_attach (const char *filename, int from_tty) + else + { + int load_via_target = 0; +- const char *scratch_pathname, *canonical_pathname; ++ const char *scratch_pathname; + int scratch_chan; + char **matching; + +@@ -397,7 +397,7 @@ exec_file_attach (const char *filename, int from_tty) + load_via_target = 1; + } + +- gdb::unique_xmalloc_ptr canonical_storage, scratch_storage; ++ gdb::unique_xmalloc_ptr scratch_storage; + if (load_via_target) + { + /* gdb_bfd_fopen does not support "target:" filenames. */ +@@ -408,7 +408,6 @@ exec_file_attach (const char *filename, int from_tty) + + scratch_pathname = filename; + scratch_chan = -1; +- canonical_pathname = scratch_pathname; + } + else + { +@@ -436,19 +435,14 @@ exec_file_attach (const char *filename, int from_tty) + perror_with_name (filename); + + scratch_pathname = scratch_storage.get (); +- +- /* gdb_bfd_open (and its variants) prefers canonicalized +- pathname for better BFD caching. */ +- canonical_storage = gdb_realpath (scratch_pathname); +- canonical_pathname = canonical_storage.get (); + } + + gdb_bfd_ref_ptr temp; + if (write_files && !load_via_target) +- temp = gdb_bfd_fopen (canonical_pathname, gnutarget, ++ temp = gdb_bfd_fopen (scratch_pathname, gnutarget, + FOPEN_RUB, scratch_chan); + else +- temp = gdb_bfd_open (canonical_pathname, gnutarget, scratch_chan); ++ temp = gdb_bfd_open (scratch_pathname, gnutarget, scratch_chan); + current_program_space->set_exec_bfd (std::move (temp)); + + if (!current_program_space->exec_bfd ()) +diff --git a/gdb/symfile.c b/gdb/symfile.c +index 7f9cada..715c5c9 100644 +--- a/gdb/symfile.c ++++ b/gdb/symfile.c +@@ -1710,7 +1710,7 @@ symfile_bfd_open (const char *name) + + /* Look down path for it, allocate 2nd new malloc'd copy. */ + desc = openp (getenv ("PATH"), +- OPF_TRY_CWD_FIRST | OPF_RETURN_REALPATH, ++ OPF_TRY_CWD_FIRST, + expanded_name.get (), O_RDONLY | O_BINARY, &absolute_name); + #if defined(__GO32__) || defined(_WIN32) || defined (__CYGWIN__) + if (desc < 0) +diff --git a/gdb/testsuite/gdb.base/symlink-exe.exp b/gdb/testsuite/gdb.base/symlink-exe.exp +new file mode 100644 +index 0000000..4a45f06 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/symlink-exe.exp +@@ -0,0 +1,57 @@ ++# Copyright 2022 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 . */ ++ ++if {![isnative]} { ++ unsupported "symlink-exe.exp not supported on non-native target" ++ return -1 ++} ++ ++if {[is_remote host]} { ++ unsupported "symlink-exe.exp not supported on remote host" ++ return -1 ++} ++ ++# We don't really care about the contents, but we're going to build ++# two executables here and they need different source file names. ++standard_testfile main.c argv0-symlink.c ++ ++if {[build_executable ${testfile}.exp ${testfile}1 ${srcfile}] == -1} { ++ return -1 ++} ++ ++set status [remote_exec host \ ++ "ln -sf ${testfile}1 [standard_output_file ${testfile}]"] ++if {[lindex $status 0] != 0} { ++ unsupported "symlink-exe.exp - host does not support symbolic links" ++ return -1 ++} ++ ++clean_restart $testfile ++gdb_test "run" ".*" ++ ++# Ensure the new file has a newer mtime. ++sleep 1 ++if {[build_executable ${testfile}.exp ${testfile}2 ${srcfile2}] == -1} { ++ return -1 ++} ++set status [remote_exec host \ ++ "ln -sf ${testfile}2 [standard_output_file ${testfile}]"] ++if {[lindex $status 0] != 0} { ++ unsupported "symlink-exe.exp - host does not support symbolic links" ++ return -1 ++} ++ ++gdb_test "run" ".*${testfile}.* has changed; re-reading symbols.*" \ ++ "run and re-read symbols"