diff options
author | Tom Tromey <tromey@adacore.com> | 2022-12-21 13:57:45 -0700 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2023-01-02 06:48:31 -0700 |
commit | dacf80765d51be840d2efc20bc058643d88ec49f (patch) | |
tree | a9354ce821a43ac0293d2a7b5e5e5200620ab635 | |
parent | b9877acc81ade609c503bbcff064e09d3e290a84 (diff) | |
download | gdb-dacf80765d51be840d2efc20bc058643d88ec49f.zip gdb-dacf80765d51be840d2efc20bc058643d88ec49f.tar.gz gdb-dacf80765d51be840d2efc20bc058643d88ec49f.tar.bz2 |
Remove target: prefix from gdb_sysroot in find_separate_debug_file
I noticed that, when using gdbserver, gdb might print:
Reading /usr/lib/debug/lib64//libcap.so.2.48-2.48-4.fc36.x86_64.debug from remote target...
Reading target:/usr/lib/debug/lib64//libcap.so.2.48-2.48-4.fc36.x86_64.debug from remote target...
The second line has the "target:" prefix, but from the code it's clear
that this string is being passed verbatim to gdbserver -- which seems
wrong.
I filed PR remote/29929 for this.
The problem here is that find_separate_debug_file uses gdb_sysroot
without checking to see if it starts with the "target:" prefix. This
patch changes this code to be a little more careful.
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29929
-rw-r--r-- | gdb/symfile.c | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/gdb/symfile.c b/gdb/symfile.c index 7f9cada..e0942df 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -1470,19 +1470,32 @@ find_separate_debug_file (const char *dir, return debugfile; /* If the file is in the sysroot, try using its base path in - the sysroot's global debugfile directory. */ - debugfile = target_prefix ? "target:" : ""; - debugfile += gdb_sysroot; - debugfile += debugdir; - debugfile += "/"; - debugfile += base_path; - debugfile += "/"; - debugfile += debuglink; - - if (separate_debug_file_exists (debugfile, crc32, objfile)) - return debugfile; + the sysroot's global debugfile directory. GDB_SYSROOT + might refer to a target: path; we strip the "target:" + prefix -- but if that would yield the empty string, we + don't bother at all, because that would just give the + same result as above. */ + if (gdb_sysroot != "target:") + { + debugfile = target_prefix ? "target:" : ""; + if (startswith (gdb_sysroot, "target:")) + { + std::string root = gdb_sysroot.substr (strlen ("target:")); + gdb_assert (!root.empty ()); + debugfile += root; + } + else + debugfile += gdb_sysroot; + debugfile += debugdir; + debugfile += "/"; + debugfile += base_path; + debugfile += "/"; + debugfile += debuglink; + + if (separate_debug_file_exists (debugfile, crc32, objfile)) + return debugfile; + } } - } return std::string (); |