aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2019-02-12 13:56:16 -0800
committerJohn Baldwin <jhb@FreeBSD.org>2019-02-12 13:56:16 -0800
commit402d2bfec425f29c5b54089d5ff98ca9a1b8ec27 (patch)
tree4d51d950b2584e326035384f3f8e53b268a52810 /gdb
parent1ed9f74e85b7ace7debad5ade4775684a1fa99f9 (diff)
downloadgdb-402d2bfec425f29c5b54089d5ff98ca9a1b8ec27.zip
gdb-402d2bfec425f29c5b54089d5ff98ca9a1b8ec27.tar.gz
gdb-402d2bfec425f29c5b54089d5ff98ca9a1b8ec27.tar.bz2
Look for separate debug files in debug directories under a sysroot.
When an object file is present in a system root, GDB currently looks for separate debug files under the global debugfile directories. For example, if the sysroot is set to "/myroot" and hte global debugfile directory is set to "/usr/lib/debug", GDB will look for a separate debug file for "/myroot/lib/libc.so.7" in the following paths: /myroot/lib/libc.so.7.debug /myroot/lib/.debug/libc.so.7.debug /usr/lib/debug//myroot/lib/libc.so.7.debug /usr/lib/debug/lib/libc.so.7.debug However, some system roots include a full system installation including a nested global debugfile directory under the sysroot. This patch adds an additional check to support such systems. In the example above the additional path searched is: /myroot/usr/lib/debug/lib/libc.so.7.debug To try to preserve existing behavior as much as possible, this new path is searched last for each global debugfile directory. gdb/ChangeLog: * symfile.c (find_separate_debug_file): Look for separate debug files in debug directories under the sysroot.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/symfile.c17
2 files changed, 20 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 194ae46..e4f74cd 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2019-02-12 John Baldwin <jhb@FreeBSD.org>
+
+ * symfile.c (find_separate_debug_file): Look for separate debug
+ files in debug directories under the sysroot.
+
2019-02-12 Philippe Waroquiers <philippe.waroquiers@skynet.be>
* symtab.h (struct minimal_symbol data_p): New const method.
diff --git a/gdb/symfile.c b/gdb/symfile.c
index e5ff384..b5802e2 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -1452,13 +1452,13 @@ find_separate_debug_file (const char *dir,
if (separate_debug_file_exists (debugfile, crc32, objfile))
return debugfile;
- /* If the file is in the sysroot, try using its base path in the
- global debugfile directory. */
if (canon_dir != NULL
&& filename_ncmp (canon_dir, gdb_sysroot,
strlen (gdb_sysroot)) == 0
&& IS_DIR_SEPARATOR (canon_dir[strlen (gdb_sysroot)]))
{
+ /* If the file is in the sysroot, try using its base path in
+ the global debugfile directory. */
debugfile = target_prefix ? "target:" : "";
debugfile += debugdir.get ();
debugfile += (canon_dir + strlen (gdb_sysroot));
@@ -1467,7 +1467,20 @@ find_separate_debug_file (const char *dir,
if (separate_debug_file_exists (debugfile, crc32, objfile))
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.get ();
+ debugfile += (canon_dir + strlen (gdb_sysroot));
+ debugfile += "/";
+ debugfile += debuglink;
+
+ if (separate_debug_file_exists (debugfile, crc32, objfile))
+ return debugfile;
}
+
}
return std::string ();