diff options
author | Keith Seitz <keiths@redhat.com> | 2019-12-07 09:35:03 -0800 |
---|---|---|
committer | Keith Seitz <keiths@redhat.com> | 2019-12-07 12:05:41 -0800 |
commit | aa2d5a4229eb541406d3b91a384ad6a62caf7760 (patch) | |
tree | cb77da7a06472447d1d9174c9fdc31f30311c305 /gdb/build-id.c | |
parent | 5fa370e437f39bf73a133cc84c4e6329943522bf (diff) | |
download | gdb-aa2d5a4229eb541406d3b91a384ad6a62caf7760.zip gdb-aa2d5a4229eb541406d3b91a384ad6a62caf7760.tar.gz gdb-aa2d5a4229eb541406d3b91a384ad6a62caf7760.tar.bz2 |
Core file build-id support
This patch uses new BFD support for detecting build-ids in core
files.
After this patch, it is possible to run gdb with only the
core file, and gdb will automatically load the executable and
debug info [example from tests]:
$ gdb -nx -q
(gdb) core-file corefile-buildid.core
[New LWP 29471]
Reading symbols from gdb.base/corefile-buildid/debugdir-exec/.build-id/36/fe5722c5a7ca3ac746a84e223c6a2a69193a24...
Core was generated by `outputs/gdb.base/coref'.
Program terminated with signal SIGABRT, Aborted.
(gdb)
This work is based on functionality available in Fedora originally
written by Jan Kratochvil.
Regression tested on buildbot.
gdb/ChangeLog:
2019-12-07 Keith Seitz <keiths@redhat.com>
* build-id.c (build_id_bfd_get): Permit bfd_core, too.
(build_id_to_debug_bfd): Make static, rewriting to use
build_id_to_bfd_suffix.
(build_id_to_bfd_suffix): Copy of build_id_to_debug_bfd,
adding `suffix' parameter. Append SUFFIX to file names
when searching for matching files.
(build_id_to_debug_bfd): Use build_id_to_bfd_suffix.
(build_id_to_exec_bfd): Likewise.
* build-id.h (build_id_to_debug_bfd): Clarify that function
searches for BFD of debug info file.
(build_id_to_exec_bfd): Declare.
* corelow.c: Include build-id.h.
(locate_exec_from_corefile_build_id): New function.
(core_target_open): If no executable BFD is found,
search for a core file BFD using build-id.
gdb/testsuite/ChangeLog:
2019-12-07 Keith Seitz <keiths@redhat.com>
* gdb.base/corefile-buildid-shlib-shr.c: New file.
* gdb.base/corefile-buildid-shlib.c: New file.
* gdb.base/corefile-buildid.c: New file.
* gdb.base/corefile-buildid.exp: New file.
Change-Id: I15e9e8e58f10c68b5cae55e2eba58df1e8aef529
Diffstat (limited to 'gdb/build-id.c')
-rw-r--r-- | gdb/build-id.c | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/gdb/build-id.c b/gdb/build-id.c index 048da2a..e8d77bb 100644 --- a/gdb/build-id.c +++ b/gdb/build-id.c @@ -32,7 +32,8 @@ const struct bfd_build_id * build_id_bfd_get (bfd *abfd) { - if (!bfd_check_format (abfd, bfd_object)) + if (!bfd_check_format (abfd, bfd_object) + && !bfd_check_format (abfd, bfd_core)) return NULL; if (abfd->build_id != NULL) @@ -117,10 +118,13 @@ build_id_to_debug_bfd_1 (const std::string &link, size_t build_id_len, return debug_bfd; } -/* See build-id.h. */ +/* Common code for finding BFDs of a given build-id. This function + works with both debuginfo files (SUFFIX == ".debug") and executable + files (SUFFIX == ""). */ -gdb_bfd_ref_ptr -build_id_to_debug_bfd (size_t build_id_len, const bfd_byte *build_id) +static gdb_bfd_ref_ptr +build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id, + const char *suffix) { /* Keep backward compatibility so that DEBUG_FILE_DIRECTORY being "" will cause "/.build-id/..." lookups. */ @@ -149,7 +153,7 @@ build_id_to_debug_bfd (size_t build_id_len, const bfd_byte *build_id) while (size-- > 0) string_appendf (link, "%02x", (unsigned) *data++); - link += ".debug"; + link += suffix; gdb_bfd_ref_ptr debug_bfd = build_id_to_debug_bfd_1 (link, build_id_len, build_id); @@ -177,6 +181,22 @@ build_id_to_debug_bfd (size_t build_id_len, const bfd_byte *build_id) /* See build-id.h. */ +gdb_bfd_ref_ptr +build_id_to_debug_bfd (size_t build_id_len, const bfd_byte *build_id) +{ + return build_id_to_bfd_suffix (build_id_len, build_id, ".debug"); +} + +/* See build-id.h. */ + +gdb_bfd_ref_ptr +build_id_to_exec_bfd (size_t build_id_len, const bfd_byte *build_id) +{ + return build_id_to_bfd_suffix (build_id_len, build_id, ""); +} + +/* See build-id.h. */ + std::string find_separate_debug_file_by_buildid (struct objfile *objfile) { |