aboutsummaryrefslogtreecommitdiff
path: root/gdb/build-id.c
diff options
context:
space:
mode:
authorJon Turney <jon.turney@dronecode.org.uk>2015-04-07 20:49:08 +0100
committerJon Turney <jon.turney@dronecode.org.uk>2015-06-15 12:10:55 +0100
commitc74f7d1c6c5a968330208757f476c67a4bb66643 (patch)
tree8561cb57dcfd9668fa5300196a891a8b5d9bc81d /gdb/build-id.c
parentf20c58f51f5735d1ba49efadc86b3ec67631410e (diff)
downloadgdb-c74f7d1c6c5a968330208757f476c67a4bb66643.zip
gdb-c74f7d1c6c5a968330208757f476c67a4bb66643.tar.gz
gdb-c74f7d1c6c5a968330208757f476c67a4bb66643.tar.bz2
Allow gdb to find debug symbols file by build-id for PE file format also
This promotes BFD's struct elf_build_id to the generic struct bfd_build_id, populated when an ELF or PE BFD is read. gdb is updated to use that, and to use the build-id to find symbols for PE files also. There is currently no generic way to extract the build-id from an object file, perhaps an option to objdump to do this might make sense? On x86_64-pc-cygwin, gdb's sepdebug.exp changes: -# of unsupported tests 1 +# of expected passes 90 I don't seem to get consistent testsuite runs on i686-linux-gnu, but there don't appear to be any regressions. bfd/ChangeLog: 2015-06-10 Jon Turney <jon.turney@dronecode.org.uk> * elf-bfd.h : Remove struct elf_build_id. * bfd.c : Add struct bfd_build_id. * bfd-in2.h: Regenerate. * elf.c (elfobj_grok_gnu_build_id): Update to use bfd_build_id. * libpei.h: Add protoype and macros for bfd_XXi_slurp_codeview_record. * peXXigen.c (_bfd_XXi_slurp_codeview_record): Make public * peicode.h (pe_bfd_read_buildid): Add. (pe_bfd_object_p): Use pe_bfd_read_buildid(). gdb/ChangeLog: 2015-06-10 Jon Turney <jon.turney@dronecode.org.uk> * build-id.c: Don't include elf-bfd.h. (build_id_bfd_get): Use bfd_build_id. (build_id_verify): Ditto. * build-id.h: Ditto. (find_separate_debug_file_by_buildid): Ditto. * python/py-objfile.c: Don't include elf-bfd.h. (objfpy_get_build_id) Use bfd_build_id. (objfpy_build_id_matches, objfpy_lookup_objfile_by_build_id): Ditto. * coffread.c: Include build-id.h. (coff_symfile_read): Try find_separate_debug_file_by_buildid. gdb/doc/ChangeLog: 2015-06-10 Jon Turney <jon.turney@dronecode.org.uk> * gdb.texinfo (Separate Debug Files): Document that PE is also supported. gdb/testsuite/ChangeLog: 2015-06-10 Jon Turney <jon.turney@dronecode.org.uk> * gdb.base/sepdebug.exp: Add EXEEXT where needed. * lib/gdb.exp (get_build_id): Teach how to extract build-id from a PE file. * lib/future.exp (gdb_find_objdump): Add gdb_find_objdump. Signed-off-by: Jon Turney <jon.turney@dronecode.org.uk>
Diffstat (limited to 'gdb/build-id.c')
-rw-r--r--gdb/build-id.c21
1 files changed, 9 insertions, 12 deletions
diff --git a/gdb/build-id.c b/gdb/build-id.c
index 8f7bbb4..ebf9f45 100644
--- a/gdb/build-id.c
+++ b/gdb/build-id.c
@@ -19,7 +19,6 @@
#include "defs.h"
#include "bfd.h"
-#include "elf-bfd.h"
#include "gdb_bfd.h"
#include "build-id.h"
#include "gdb_vecs.h"
@@ -30,19 +29,17 @@
/* See build-id.h. */
-const struct elf_build_id *
+const struct bfd_build_id *
build_id_bfd_get (bfd *abfd)
{
- if (!bfd_check_format (abfd, bfd_object)
- || bfd_get_flavour (abfd) != bfd_target_elf_flavour
- /* Although this is ELF_specific, it is safe to do in generic
- code because it does not rely on any ELF-specific symbols at
- link time, and if the ELF code is not available in BFD, then
- ABFD will not have the ELF flavour. */
- || elf_tdata (abfd)->build_id == NULL)
+ if (!bfd_check_format (abfd, bfd_object))
return NULL;
- return elf_tdata (abfd)->build_id;
+ if (abfd->build_id != NULL)
+ return abfd->build_id;
+
+ /* No build-id */
+ return NULL;
}
/* See build-id.h. */
@@ -50,7 +47,7 @@ build_id_bfd_get (bfd *abfd)
int
build_id_verify (bfd *abfd, size_t check_len, const bfd_byte *check)
{
- const struct elf_build_id *found;
+ const struct bfd_build_id *found;
int retval = 0;
found = build_id_bfd_get (abfd);
@@ -139,7 +136,7 @@ build_id_to_debug_bfd (size_t build_id_len, const bfd_byte *build_id)
char *
find_separate_debug_file_by_buildid (struct objfile *objfile)
{
- const struct elf_build_id *build_id;
+ const struct bfd_build_id *build_id;
build_id = build_id_bfd_get (objfile->obfd);
if (build_id != NULL)