mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-28 18:10:46 +00:00
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
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user