* [PATCH] Find debug symbols file by buildid for coff file format also @ 2015-03-16 15:37 Jon TURNEY 2015-03-16 16:30 ` Eli Zaretskii 0 siblings, 1 reply; 16+ messages in thread From: Jon TURNEY @ 2015-03-16 15:37 UTC (permalink / raw) To: gdb-patches; +Cc: Jon TURNEY bfd/ChangeLog: 2015-03-14 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-03-14 Jon TURNEY <jon.turney@dronecode.org.uk> * build-id.c (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 (objfpy_get_build_id) (objfpy_build_id_matches, objfpy_lookup_objfile_by_build_id): Ditto. * coffread.c (coff_symfile_read): Try find_separate_debug_file_by_buildid. gdb/doc/ChangeLog: 2015-03-14 Jon TURNEY <jon.turney@dronecode.org.uk> * gdb.texinfo (Separate Debug Files): Document that COFF is also supported. --- bfd/bfd-in2.h | 9 +++++ bfd/bfd.c | 9 +++++ bfd/elf-bfd.h | 10 ----- bfd/elf.c | 12 +++--- bfd/libpei.h | 4 ++ bfd/peXXigen.c | 2 +- bfd/peicode.h | 100 ++++++++++++++++++++++++++++++++++++++++++++++-- gdb/build-id.c | 23 ++++++----- gdb/build-id.h | 2 +- gdb/coffread.c | 6 ++- gdb/doc/gdb.texinfo | 2 +- gdb/python/py-objfile.c | 7 ++-- 12 files changed, 146 insertions(+), 40 deletions(-) diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 2d2e7ac..5da34b7 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -6289,6 +6289,12 @@ enum bfd_plugin_format bfd_plugin_no = 2 }; +struct bfd_build_id + { + size_t size; + bfd_byte data[1]; + }; + struct bfd { /* The filename the application opened the BFD with. */ @@ -6565,6 +6571,9 @@ struct bfd struct objalloc *, but we use void * to avoid requiring the inclusion of objalloc.h. */ void *memory; + + /* For input BFDs, the build ID, if the object has one. */ + const struct bfd_build_id *build_id; }; /* See note beside bfd_set_section_userdata. */ diff --git a/bfd/bfd.c b/bfd/bfd.c index 5ae5eca..1869b2c 100644 --- a/bfd/bfd.c +++ b/bfd/bfd.c @@ -51,6 +51,12 @@ CODE_FRAGMENT . bfd_plugin_no = 2 . }; . +.struct bfd_build_id +. { +. size_t size; +. bfd_byte data[1]; +. }; +. .struct bfd .{ . {* The filename the application opened the BFD with. *} @@ -327,6 +333,9 @@ CODE_FRAGMENT . struct objalloc *, but we use void * to avoid requiring the inclusion . of objalloc.h. *} . void *memory; +. +. {* For input BFDs, the build ID, if the object has one. *} +. const struct bfd_build_id *build_id; .}; . .{* See note beside bfd_set_section_userdata. *} diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 13c32e0..75cbbe3 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -1524,13 +1524,6 @@ struct sdt_note bfd_byte data[1]; }; -/* NT_GNU_BUILD_ID note type info for input BFDs. */ -struct elf_build_id -{ - size_t size; - bfd_byte data[1]; -}; - /* tdata information grabbed from an elf core file. */ struct core_elf_obj_tdata { @@ -1665,9 +1658,6 @@ struct elf_obj_tdata obj_attribute known_obj_attributes[2][NUM_KNOWN_OBJ_ATTRIBUTES]; obj_attribute_list *other_obj_attributes[2]; - /* NT_GNU_BUILD_ID note type. */ - struct elf_build_id *build_id; - /* Linked-list containing information about every Systemtap section found in the object file. Each section corresponds to one entry in the list. */ diff --git a/bfd/elf.c b/bfd/elf.c index 13d4272..6513790 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -8830,18 +8830,18 @@ elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note) static bfd_boolean elfobj_grok_gnu_build_id (bfd *abfd, Elf_Internal_Note *note) { - struct elf_obj_tdata *t; + struct bfd_build_id* build_id; if (note->descsz == 0) return FALSE; - t = elf_tdata (abfd); - t->build_id = bfd_alloc (abfd, sizeof (*t->build_id) - 1 + note->descsz); - if (t->build_id == NULL) + build_id = bfd_alloc (abfd, sizeof (struct bfd_build_id) - 1 + note->descsz); + if (build_id == NULL) return FALSE; - t->build_id->size = note->descsz; - memcpy (t->build_id->data, note->descdata, note->descsz); + build_id->size = note->descsz; + memcpy (build_id->data, note->descdata, note->descsz); + abfd->build_id = build_id; return TRUE; } diff --git a/bfd/libpei.h b/bfd/libpei.h index d19a3b2..a6f3da0 100644 --- a/bfd/libpei.h +++ b/bfd/libpei.h @@ -238,6 +238,7 @@ #define _bfd_XXi_swap_debugdir_in _bfd_pex64i_swap_debugdir_in #define _bfd_XXi_swap_debugdir_out _bfd_pex64i_swap_debugdir_out #define _bfd_XXi_write_codeview_record _bfd_pex64i_write_codeview_record +#define _bfd_XXi_slurp_codeview_record _bfd_pex64i_slurp_codeview_record #elif defined COFF_WITH_pep @@ -272,6 +273,7 @@ #define _bfd_XXi_swap_debugdir_in _bfd_pepi_swap_debugdir_in #define _bfd_XXi_swap_debugdir_out _bfd_pepi_swap_debugdir_out #define _bfd_XXi_write_codeview_record _bfd_pepi_write_codeview_record +#define _bfd_XXi_slurp_codeview_record _bfd_pepi_slurp_codeview_record #else /* !COFF_WITH_pep */ @@ -306,6 +308,7 @@ #define _bfd_XXi_swap_debugdir_in _bfd_pei_swap_debugdir_in #define _bfd_XXi_swap_debugdir_out _bfd_pei_swap_debugdir_out #define _bfd_XXi_write_codeview_record _bfd_pei_write_codeview_record +#define _bfd_XXi_slurp_codeview_record _bfd_pei_slurp_codeview_record #endif /* !COFF_WITH_pep */ @@ -351,6 +354,7 @@ bfd_boolean _bfd_XXi_final_link_postscript (bfd *, struct coff_final_link_info * void _bfd_XXi_swap_debugdir_in (bfd *, void *, void *); unsigned _bfd_XXi_swap_debugdir_out (bfd *, void *, void *); unsigned _bfd_XXi_write_codeview_record (bfd *, file_ptr, CODEVIEW_INFO *); +CODEVIEW_INFO * _bfd_XXi_slurp_codeview_record (bfd * abfd, file_ptr where, unsigned long length, CODEVIEW_INFO *cvinfo); /* The following are needed only for ONE of pe or pei, but don't otherwise vary; peicode.h fixes up ifdefs but we provide the diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c index 6aa18ca..4ed9579 100644 --- a/bfd/peXXigen.c +++ b/bfd/peXXigen.c @@ -1140,7 +1140,7 @@ _bfd_XXi_swap_debugdir_out (bfd * abfd, void * inp, void * extp) return sizeof (struct external_IMAGE_DEBUG_DIRECTORY); } -static CODEVIEW_INFO * +CODEVIEW_INFO * _bfd_XXi_slurp_codeview_record (bfd * abfd, file_ptr where, unsigned long length, CODEVIEW_INFO *cvinfo) { char buffer[256+1]; diff --git a/bfd/peicode.h b/bfd/peicode.h index e36568a..2209f70 100644 --- a/bfd/peicode.h +++ b/bfd/peicode.h @@ -1246,6 +1246,87 @@ pe_ILF_object_p (bfd * abfd) return abfd->xvec; } +static void +pe_bfd_read_buildid(bfd *abfd) +{ + pe_data_type *pe = pe_data (abfd); + struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr; + asection *section; + bfd_byte *data = 0; + bfd_size_type dataoff; + unsigned int i; + + bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress; + bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size; + + if (size == 0) + return; + + addr += extra->ImageBase; + + /* Search for the section containing the DebugDirectory */ + for (section = abfd->sections; section != NULL; section = section->next) + { + if ((addr >= section->vma) && (addr < (section->vma + section->size))) + break; + } + + if (section == NULL) + { + return; + } + else if (!(section->flags & SEC_HAS_CONTENTS)) + { + return; + } + + dataoff = addr - section->vma; + + /* Read the whole section. */ + if (!bfd_malloc_and_get_section (abfd, section, &data)) + { + if (data != NULL) + free (data); + return; + } + + /* Search for a CodeView entry in the DebugDirectory */ + for (i = 0; i < size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++) + { + struct external_IMAGE_DEBUG_DIRECTORY *ext + = &((struct external_IMAGE_DEBUG_DIRECTORY *)(data + dataoff))[i]; + struct internal_IMAGE_DEBUG_DIRECTORY idd; + + _bfd_XXi_swap_debugdir_in (abfd, ext, &idd); + + if (idd.Type == PE_IMAGE_DEBUG_TYPE_CODEVIEW) + { + char buffer[256 + 1]; + CODEVIEW_INFO *cvinfo = (CODEVIEW_INFO *) buffer; + + /* + The debug entry doesn't have to have to be in a section, in which + case AddressOfRawData is 0, so always use PointerToRawData. + */ + if (_bfd_XXi_slurp_codeview_record (abfd, + (file_ptr) idd.PointerToRawData, + idd.SizeOfData, cvinfo)) + { + struct bfd_build_id* build_id = bfd_alloc(abfd, + sizeof(struct bfd_build_id) + cvinfo->SignatureLength); + if (build_id) + { + build_id->size = cvinfo->SignatureLength; + memcpy(build_id->data, cvinfo->Signature, + cvinfo->SignatureLength); + abfd->build_id = build_id; + } + } + break; + } + } +} + static const bfd_target * pe_bfd_object_p (bfd * abfd) { @@ -1256,6 +1337,7 @@ pe_bfd_object_p (bfd * abfd) struct internal_aouthdr internal_a; file_ptr opt_hdr_size; file_ptr offset; + const bfd_target *result; /* Detect if this a Microsoft Import Library Format element. */ /* First read the beginning of the header. */ @@ -1349,10 +1431,20 @@ pe_bfd_object_p (bfd * abfd) return NULL; } - return coff_real_object_p (abfd, internal_f.f_nscns, &internal_f, - (opt_hdr_size != 0 - ? &internal_a - : (struct internal_aouthdr *) NULL)); + + result = coff_real_object_p (abfd, internal_f.f_nscns, &internal_f, + (opt_hdr_size != 0 + ? &internal_a + : (struct internal_aouthdr *) NULL)); + + + if (result) + { + /* Now the whole header has been processed, see if there is a build-id */ + pe_bfd_read_buildid(abfd); + } + + return result; } #define coff_object_p pe_bfd_object_p diff --git a/gdb/build-id.c b/gdb/build-id.c index 3a6ebb1..37c311b 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" @@ -29,19 +28,19 @@ /* 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. */ @@ -49,7 +48,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); @@ -138,7 +137,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) diff --git a/gdb/build-id.h b/gdb/build-id.h index f77dda2..bea761b 100644 --- a/gdb/build-id.h +++ b/gdb/build-id.h @@ -22,7 +22,7 @@ /* Locate NT_GNU_BUILD_ID from ABFD and return its content. */ -extern const struct elf_build_id *build_id_bfd_get (bfd *abfd); +extern const struct bfd_build_id *build_id_bfd_get (bfd *abfd); /* Return true if ABFD has NT_GNU_BUILD_ID matching the CHECK value. Otherwise, issue a warning and return false. */ diff --git a/gdb/coffread.c b/gdb/coffread.c index 28f7b18..5700655 100644 --- a/gdb/coffread.c +++ b/gdb/coffread.c @@ -41,6 +41,7 @@ #include "coff-pe-read.h" #include "psymtab.h" +#include "build-id.h" extern void _initialize_coffread (void); @@ -727,7 +728,10 @@ coff_symfile_read (struct objfile *objfile, int symfile_flags) { char *debugfile; - debugfile = find_separate_debug_file_by_debuglink (objfile); + debugfile = find_separate_debug_file_by_buildid (objfile); + + if (debugfile == NULL) + debugfile = find_separate_debug_file_by_debuglink (objfile); make_cleanup (xfree, debugfile); if (debugfile) diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 9e71642..2222445 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -18022,7 +18022,7 @@ the executable and the debug file came from the same build. @item The executable contains a @dfn{build ID}, a unique bit string that is also present in the corresponding debug info file. (This is supported -only on some operating systems, notably those which use the ELF format +only on some operating systems, when using the ELF or PE file formats for binary files and the @sc{gnu} Binutils.) For more details about this feature, see the description of the @option{--build-id} command-line option in @ref{Options, , Command Line Options, ld.info, diff --git a/gdb/python/py-objfile.c b/gdb/python/py-objfile.c index 157d200..c0e3f41 100644 --- a/gdb/python/py-objfile.c +++ b/gdb/python/py-objfile.c @@ -23,7 +23,6 @@ #include "objfiles.h" #include "language.h" #include "build-id.h" -#include "elf-bfd.h" #include "symtab.h" typedef struct @@ -130,7 +129,7 @@ objfpy_get_build_id (PyObject *self, void *closure) { objfile_object *obj = (objfile_object *) self; struct objfile *objfile = obj->objfile; - const struct elf_build_id *build_id = NULL; + const struct bfd_build_id *build_id = NULL; OBJFPY_REQUIRE_VALID (obj); @@ -433,7 +432,7 @@ objfpy_build_id_ok (const char *string) It is assumed that objfpy_build_id_ok (string) returns TRUE. */ static int -objfpy_build_id_matches (const struct elf_build_id *build_id, +objfpy_build_id_matches (const struct bfd_build_id *build_id, const char *string) { size_t i; @@ -491,7 +490,7 @@ objfpy_lookup_objfile_by_build_id (const char *build_id) ALL_OBJFILES (objfile) { - const struct elf_build_id *obfd_build_id; + const struct bfd_build_id *obfd_build_id; if (objfile->obfd == NULL) continue; -- 2.1.4 ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] Find debug symbols file by buildid for coff file format also 2015-03-16 15:37 [PATCH] Find debug symbols file by buildid for coff file format also Jon TURNEY @ 2015-03-16 16:30 ` Eli Zaretskii 2015-03-17 12:56 ` Jon TURNEY 0 siblings, 1 reply; 16+ messages in thread From: Eli Zaretskii @ 2015-03-16 16:30 UTC (permalink / raw) To: Jon TURNEY; +Cc: gdb-patches, jon.turney > From: Jon TURNEY <jon.turney@dronecode.org.uk> > Cc: Jon TURNEY <jon.turney@dronecode.org.uk> > Date: Mon, 16 Mar 2015 15:37:10 +0000 > > bfd/ChangeLog: > > 2015-03-14 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-03-14 Jon TURNEY <jon.turney@dronecode.org.uk> > > * build-id.c (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 (objfpy_get_build_id) > (objfpy_build_id_matches, objfpy_lookup_objfile_by_build_id): Ditto. > * coffread.c (coff_symfile_read): Try > find_separate_debug_file_by_buildid. > > gdb/doc/ChangeLog: > > 2015-03-14 Jon TURNEY <jon.turney@dronecode.org.uk> > > * gdb.texinfo (Separate Debug Files): Document that COFF is also > supported. The gdb.texinfo part is OK, except that AFAIK PE is not the same as COFF, so I suggest to amend the ChangeLog entry above. Thanks. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] Find debug symbols file by buildid for coff file format also 2015-03-16 16:30 ` Eli Zaretskii @ 2015-03-17 12:56 ` Jon TURNEY 2015-04-08 12:17 ` [PATCH] Find debug symbols file by buildid for PE " Jon TURNEY 0 siblings, 1 reply; 16+ messages in thread From: Jon TURNEY @ 2015-03-17 12:56 UTC (permalink / raw) To: Eli Zaretskii; +Cc: gdb-patches On 16/03/2015 16:30, Eli Zaretskii wrote: [...] >> >> gdb/doc/ChangeLog: >> >> 2015-03-14 Jon TURNEY <jon.turney@dronecode.org.uk> >> >> * gdb.texinfo (Separate Debug Files): Document that COFF is also >> supported. > > The gdb.texinfo part is OK, except that AFAIK PE is not the same as > COFF, so I suggest to amend the ChangeLog entry above. Yes, this should say PE in the ChangeLog (and subject). ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] Find debug symbols file by buildid for PE file format also 2015-03-17 12:56 ` Jon TURNEY @ 2015-04-08 12:17 ` Jon TURNEY 2015-04-08 12:39 ` Eli Zaretskii ` (3 more replies) 0 siblings, 4 replies; 16+ messages in thread From: Jon TURNEY @ 2015-04-08 12:17 UTC (permalink / raw) To: gdb-patches [-- Attachment #1: Type: text/plain, Size: 496 bytes --] On 17/03/2015 12:56, Jon TURNEY wrote: > On 16/03/2015 16:30, Eli Zaretskii wrote: > [...] >>> >>> gdb/doc/ChangeLog: >>> >>> 2015-03-14 Jon TURNEY <jon.turney@dronecode.org.uk> >>> >>> * gdb.texinfo (Separate Debug Files): Document that COFF is also >>> supported. >> >> The gdb.texinfo part is OK, except that AFAIK PE is not the same as >> COFF, so I suggest to amend the ChangeLog entry above. > > Yes, this should say PE in the ChangeLog (and subject). Updated patch attached. [-- Attachment #2: 0001-Find-debug-symbols-file-by-buildid-for-PE-file-forma.patch --] [-- Type: text/plain, Size: 21181 bytes --] From 00afa21b47ebc9915ed49e125b6123d9223c786d Mon Sep 17 00:00:00 2001 From: Jon Turney <jon.turney@dronecode.org.uk> Date: Tue, 7 Apr 2015 20:49:08 +0100 Subject: [PATCH] Find debug symbols file by buildid for PE file format also On x86_64-pc-cygwin, 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-04-07 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-04-07 Jon Turney <jon.turney@dronecode.org.uk> * build-id.c (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 (objfpy_get_build_id) (objfpy_build_id_matches, objfpy_lookup_objfile_by_build_id): Ditto. * coffread.c (coff_symfile_read): Try find_separate_debug_file_by_buildid. gdb/doc/ChangeLog: 2015-04-07 Jon Turney <jon.turney@dronecode.org.uk> * gdb.texinfo (Separate Debug Files): Document that PE is also supported. gdb/testsuite/ChangeLog: 2015-04-07 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. --- bfd/ChangeLog | 12 +++++ bfd/bfd-in2.h | 9 ++++ bfd/bfd.c | 9 ++++ bfd/elf-bfd.h | 10 ---- bfd/elf.c | 12 ++--- bfd/libpei.h | 4 ++ bfd/peXXigen.c | 2 +- bfd/peicode.h | 100 ++++++++++++++++++++++++++++++++++-- gdb/ChangeLog | 11 ++++ gdb/build-id.c | 23 ++++----- gdb/build-id.h | 2 +- gdb/coffread.c | 6 ++- gdb/doc/ChangeLog | 5 ++ gdb/doc/gdb.texinfo | 2 +- gdb/python/py-objfile.c | 7 ++- gdb/testsuite/ChangeLog | 7 +++ gdb/testsuite/gdb.base/sepdebug.exp | 12 ++--- gdb/testsuite/lib/future.exp | 10 ++++ gdb/testsuite/lib/gdb.exp | 53 +++++++++++-------- 19 files changed, 230 insertions(+), 66 deletions(-) diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 81def3f..393d01b 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -6289,6 +6289,12 @@ enum bfd_plugin_format bfd_plugin_no = 2 }; +struct bfd_build_id + { + size_t size; + bfd_byte data[1]; + }; + struct bfd { /* The filename the application opened the BFD with. */ @@ -6565,6 +6571,9 @@ struct bfd struct objalloc *, but we use void * to avoid requiring the inclusion of objalloc.h. */ void *memory; + + /* For input BFDs, the build ID, if the object has one. */ + const struct bfd_build_id *build_id; }; /* See note beside bfd_set_section_userdata. */ diff --git a/bfd/bfd.c b/bfd/bfd.c index 5ae5eca..1869b2c 100644 --- a/bfd/bfd.c +++ b/bfd/bfd.c @@ -51,6 +51,12 @@ CODE_FRAGMENT . bfd_plugin_no = 2 . }; . +.struct bfd_build_id +. { +. size_t size; +. bfd_byte data[1]; +. }; +. .struct bfd .{ . {* The filename the application opened the BFD with. *} @@ -327,6 +333,9 @@ CODE_FRAGMENT . struct objalloc *, but we use void * to avoid requiring the inclusion . of objalloc.h. *} . void *memory; +. +. {* For input BFDs, the build ID, if the object has one. *} +. const struct bfd_build_id *build_id; .}; . .{* See note beside bfd_set_section_userdata. *} diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index e435e52..342ac65 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -1528,13 +1528,6 @@ struct sdt_note bfd_byte data[1]; }; -/* NT_GNU_BUILD_ID note type info for input BFDs. */ -struct elf_build_id -{ - size_t size; - bfd_byte data[1]; -}; - /* tdata information grabbed from an elf core file. */ struct core_elf_obj_tdata { @@ -1669,9 +1662,6 @@ struct elf_obj_tdata obj_attribute known_obj_attributes[2][NUM_KNOWN_OBJ_ATTRIBUTES]; obj_attribute_list *other_obj_attributes[2]; - /* NT_GNU_BUILD_ID note type. */ - struct elf_build_id *build_id; - /* Linked-list containing information about every Systemtap section found in the object file. Each section corresponds to one entry in the list. */ diff --git a/bfd/elf.c b/bfd/elf.c index f3c9050..9230856 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -8863,18 +8863,18 @@ elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note) static bfd_boolean elfobj_grok_gnu_build_id (bfd *abfd, Elf_Internal_Note *note) { - struct elf_obj_tdata *t; + struct bfd_build_id* build_id; if (note->descsz == 0) return FALSE; - t = elf_tdata (abfd); - t->build_id = bfd_alloc (abfd, sizeof (*t->build_id) - 1 + note->descsz); - if (t->build_id == NULL) + build_id = bfd_alloc (abfd, sizeof (struct bfd_build_id) - 1 + note->descsz); + if (build_id == NULL) return FALSE; - t->build_id->size = note->descsz; - memcpy (t->build_id->data, note->descdata, note->descsz); + build_id->size = note->descsz; + memcpy (build_id->data, note->descdata, note->descsz); + abfd->build_id = build_id; return TRUE; } diff --git a/bfd/libpei.h b/bfd/libpei.h index d19a3b2..a6f3da0 100644 --- a/bfd/libpei.h +++ b/bfd/libpei.h @@ -238,6 +238,7 @@ #define _bfd_XXi_swap_debugdir_in _bfd_pex64i_swap_debugdir_in #define _bfd_XXi_swap_debugdir_out _bfd_pex64i_swap_debugdir_out #define _bfd_XXi_write_codeview_record _bfd_pex64i_write_codeview_record +#define _bfd_XXi_slurp_codeview_record _bfd_pex64i_slurp_codeview_record #elif defined COFF_WITH_pep @@ -272,6 +273,7 @@ #define _bfd_XXi_swap_debugdir_in _bfd_pepi_swap_debugdir_in #define _bfd_XXi_swap_debugdir_out _bfd_pepi_swap_debugdir_out #define _bfd_XXi_write_codeview_record _bfd_pepi_write_codeview_record +#define _bfd_XXi_slurp_codeview_record _bfd_pepi_slurp_codeview_record #else /* !COFF_WITH_pep */ @@ -306,6 +308,7 @@ #define _bfd_XXi_swap_debugdir_in _bfd_pei_swap_debugdir_in #define _bfd_XXi_swap_debugdir_out _bfd_pei_swap_debugdir_out #define _bfd_XXi_write_codeview_record _bfd_pei_write_codeview_record +#define _bfd_XXi_slurp_codeview_record _bfd_pei_slurp_codeview_record #endif /* !COFF_WITH_pep */ @@ -351,6 +354,7 @@ bfd_boolean _bfd_XXi_final_link_postscript (bfd *, struct coff_final_link_info * void _bfd_XXi_swap_debugdir_in (bfd *, void *, void *); unsigned _bfd_XXi_swap_debugdir_out (bfd *, void *, void *); unsigned _bfd_XXi_write_codeview_record (bfd *, file_ptr, CODEVIEW_INFO *); +CODEVIEW_INFO * _bfd_XXi_slurp_codeview_record (bfd * abfd, file_ptr where, unsigned long length, CODEVIEW_INFO *cvinfo); /* The following are needed only for ONE of pe or pei, but don't otherwise vary; peicode.h fixes up ifdefs but we provide the diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c index 6aa18ca..4ed9579 100644 --- a/bfd/peXXigen.c +++ b/bfd/peXXigen.c @@ -1140,7 +1140,7 @@ _bfd_XXi_swap_debugdir_out (bfd * abfd, void * inp, void * extp) return sizeof (struct external_IMAGE_DEBUG_DIRECTORY); } -static CODEVIEW_INFO * +CODEVIEW_INFO * _bfd_XXi_slurp_codeview_record (bfd * abfd, file_ptr where, unsigned long length, CODEVIEW_INFO *cvinfo) { char buffer[256+1]; diff --git a/bfd/peicode.h b/bfd/peicode.h index 200ef5e..06bcaa9 100644 --- a/bfd/peicode.h +++ b/bfd/peicode.h @@ -1255,6 +1255,87 @@ pe_ILF_object_p (bfd * abfd) return abfd->xvec; } +static void +pe_bfd_read_buildid(bfd *abfd) +{ + pe_data_type *pe = pe_data (abfd); + struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr; + asection *section; + bfd_byte *data = 0; + bfd_size_type dataoff; + unsigned int i; + + bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress; + bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size; + + if (size == 0) + return; + + addr += extra->ImageBase; + + /* Search for the section containing the DebugDirectory */ + for (section = abfd->sections; section != NULL; section = section->next) + { + if ((addr >= section->vma) && (addr < (section->vma + section->size))) + break; + } + + if (section == NULL) + { + return; + } + else if (!(section->flags & SEC_HAS_CONTENTS)) + { + return; + } + + dataoff = addr - section->vma; + + /* Read the whole section. */ + if (!bfd_malloc_and_get_section (abfd, section, &data)) + { + if (data != NULL) + free (data); + return; + } + + /* Search for a CodeView entry in the DebugDirectory */ + for (i = 0; i < size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++) + { + struct external_IMAGE_DEBUG_DIRECTORY *ext + = &((struct external_IMAGE_DEBUG_DIRECTORY *)(data + dataoff))[i]; + struct internal_IMAGE_DEBUG_DIRECTORY idd; + + _bfd_XXi_swap_debugdir_in (abfd, ext, &idd); + + if (idd.Type == PE_IMAGE_DEBUG_TYPE_CODEVIEW) + { + char buffer[256 + 1]; + CODEVIEW_INFO *cvinfo = (CODEVIEW_INFO *) buffer; + + /* + The debug entry doesn't have to have to be in a section, in which + case AddressOfRawData is 0, so always use PointerToRawData. + */ + if (_bfd_XXi_slurp_codeview_record (abfd, + (file_ptr) idd.PointerToRawData, + idd.SizeOfData, cvinfo)) + { + struct bfd_build_id* build_id = bfd_alloc(abfd, + sizeof(struct bfd_build_id) + cvinfo->SignatureLength); + if (build_id) + { + build_id->size = cvinfo->SignatureLength; + memcpy(build_id->data, cvinfo->Signature, + cvinfo->SignatureLength); + abfd->build_id = build_id; + } + } + break; + } + } +} + static const bfd_target * pe_bfd_object_p (bfd * abfd) { @@ -1265,6 +1346,7 @@ pe_bfd_object_p (bfd * abfd) struct internal_aouthdr internal_a; file_ptr opt_hdr_size; file_ptr offset; + const bfd_target *result; /* Detect if this a Microsoft Import Library Format element. */ /* First read the beginning of the header. */ @@ -1358,10 +1440,20 @@ pe_bfd_object_p (bfd * abfd) return NULL; } - return coff_real_object_p (abfd, internal_f.f_nscns, &internal_f, - (opt_hdr_size != 0 - ? &internal_a - : (struct internal_aouthdr *) NULL)); + + result = coff_real_object_p (abfd, internal_f.f_nscns, &internal_f, + (opt_hdr_size != 0 + ? &internal_a + : (struct internal_aouthdr *) NULL)); + + + if (result) + { + /* Now the whole header has been processed, see if there is a build-id */ + pe_bfd_read_buildid(abfd); + } + + return result; } #define coff_object_p pe_bfd_object_p diff --git a/gdb/build-id.c b/gdb/build-id.c index 3a6ebb1..37c311b 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" @@ -29,19 +28,19 @@ /* 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. */ @@ -49,7 +48,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); @@ -138,7 +137,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) diff --git a/gdb/build-id.h b/gdb/build-id.h index f77dda2..bea761b 100644 --- a/gdb/build-id.h +++ b/gdb/build-id.h @@ -22,7 +22,7 @@ /* Locate NT_GNU_BUILD_ID from ABFD and return its content. */ -extern const struct elf_build_id *build_id_bfd_get (bfd *abfd); +extern const struct bfd_build_id *build_id_bfd_get (bfd *abfd); /* Return true if ABFD has NT_GNU_BUILD_ID matching the CHECK value. Otherwise, issue a warning and return false. */ diff --git a/gdb/coffread.c b/gdb/coffread.c index 3b5a968..7722cdb 100644 --- a/gdb/coffread.c +++ b/gdb/coffread.c @@ -41,6 +41,7 @@ #include "coff-pe-read.h" #include "psymtab.h" +#include "build-id.h" extern void _initialize_coffread (void); @@ -738,7 +739,10 @@ coff_symfile_read (struct objfile *objfile, int symfile_flags) { char *debugfile; - debugfile = find_separate_debug_file_by_debuglink (objfile); + debugfile = find_separate_debug_file_by_buildid (objfile); + + if (debugfile == NULL) + debugfile = find_separate_debug_file_by_debuglink (objfile); make_cleanup (xfree, debugfile); if (debugfile) diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index c6e9b9b..b31e261 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -18062,7 +18062,7 @@ the executable and the debug file came from the same build. @item The executable contains a @dfn{build ID}, a unique bit string that is also present in the corresponding debug info file. (This is supported -only on some operating systems, notably those which use the ELF format +only on some operating systems, when using the ELF or PE file formats for binary files and the @sc{gnu} Binutils.) For more details about this feature, see the description of the @option{--build-id} command-line option in @ref{Options, , Command Line Options, ld.info, diff --git a/gdb/python/py-objfile.c b/gdb/python/py-objfile.c index 157d200..c0e3f41 100644 --- a/gdb/python/py-objfile.c +++ b/gdb/python/py-objfile.c @@ -23,7 +23,6 @@ #include "objfiles.h" #include "language.h" #include "build-id.h" -#include "elf-bfd.h" #include "symtab.h" typedef struct @@ -130,7 +129,7 @@ objfpy_get_build_id (PyObject *self, void *closure) { objfile_object *obj = (objfile_object *) self; struct objfile *objfile = obj->objfile; - const struct elf_build_id *build_id = NULL; + const struct bfd_build_id *build_id = NULL; OBJFPY_REQUIRE_VALID (obj); @@ -433,7 +432,7 @@ objfpy_build_id_ok (const char *string) It is assumed that objfpy_build_id_ok (string) returns TRUE. */ static int -objfpy_build_id_matches (const struct elf_build_id *build_id, +objfpy_build_id_matches (const struct bfd_build_id *build_id, const char *string) { size_t i; @@ -491,7 +490,7 @@ objfpy_lookup_objfile_by_build_id (const char *build_id) ALL_OBJFILES (objfile) { - const struct elf_build_id *obfd_build_id; + const struct bfd_build_id *obfd_build_id; if (objfile->obfd == NULL) continue; diff --git a/gdb/testsuite/gdb.base/sepdebug.exp b/gdb/testsuite/gdb.base/sepdebug.exp index 3194377..c363be4 100644 --- a/gdb/testsuite/gdb.base/sepdebug.exp +++ b/gdb/testsuite/gdb.base/sepdebug.exp @@ -42,7 +42,7 @@ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {deb # the name of a debuginfo only file. This file will be stored in the # gdb.base/ subdirectory. -if [gdb_gnu_strip_debug $binfile] { +if [gdb_gnu_strip_debug $binfile$EXEEXT] { # check that you have a recent version of strip and objcopy installed unsupported "cannot produce separate debug info files" return -1 @@ -60,7 +60,7 @@ set new_name [standard_output_file ${testfile}${EXEEXT}] remote_exec build "rm -rf [file dirname $new_name]" remote_exec build "mkdir [file dirname $new_name]" -remote_exec build "ln -s ${binfile} $new_name" +remote_exec build "ln -s ${binfile}${EXEEXT} $new_name" clean_restart ${testfile}${EXEEXT} if { $gdb_file_cmd_debug_info != "debug" } then { fail "No debug information found." @@ -716,10 +716,10 @@ proc test_different_dir {type test_different_dir xfail} { # the "set debug-file-directory" command. set different_dir [standard_output_file ${testfile}.dir] -set debugfile "${different_dir}/[standard_output_file ${testfile}.debug]" +set debugfile "${different_dir}/[standard_output_file ${testfile}${EXEEXT}.debug]" remote_exec build "rm -rf $different_dir" remote_exec build "mkdir -p [file dirname $debugfile]" -remote_exec build "mv -f [standard_output_file ${testfile}.debug] $debugfile" +remote_exec build "mv -f [standard_output_file ${testfile}${EXEEXT}.debug] $debugfile" test_different_dir debuglink $different_dir 0 @@ -727,7 +727,7 @@ test_different_dir debuglink $different_dir 0 # Test CRC mismatch is reported. if {[build_executable sepdebug.exp sepdebug2 sepdebug2.c debug] != -1 - && ![gdb_gnu_strip_debug [standard_output_file sepdebug2]]} { + && ![gdb_gnu_strip_debug [standard_output_file sepdebug2]$EXEEXT]} { remote_exec build "cp ${debugfile} [standard_output_file sepdebug2.debug]" @@ -743,7 +743,7 @@ if {[build_executable sepdebug.exp sepdebug2 sepdebug2.c debug] != -1 # NT_GNU_BUILD_ID / .note.gnu.build-id test: -set build_id_debug_filename [build_id_debug_filename_get $binfile] +set build_id_debug_filename [build_id_debug_filename_get $binfile$EXEEXT] if ![string compare $build_id_debug_filename ""] then { unsupported "build-id is not supported by the compiler" diff --git a/gdb/testsuite/lib/future.exp b/gdb/testsuite/lib/future.exp index 2fb635b..fd4c153 100644 --- a/gdb/testsuite/lib/future.exp +++ b/gdb/testsuite/lib/future.exp @@ -104,6 +104,16 @@ proc gdb_find_objcopy {} { return $objcopy } +proc gdb_find_objdump {} { + global OBJDUMP_FOR_TARGET + if [info exists OBJDUMP_FOR_TARGET] { + set objdump $OBJDUMP_FOR_TARGET + } else { + set objdump [transform objdump] + } + return $objdump +} + proc gdb_find_readelf {} { global READELF_FOR_TARGET if [info exists READELF_FOR_TARGET] { diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index 1a576c0..6753ab3 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -4452,28 +4452,41 @@ gdb_caching_proc gdb_has_argv0 { # Returns "" if there is none. proc get_build_id { filename } { - set tmp [standard_output_file "${filename}-tmp"] - set objcopy_program [gdb_find_objcopy] - - set result [catch "exec $objcopy_program -j .note.gnu.build-id -O binary $filename $tmp" output] - verbose "result is $result" - verbose "output is $output" - if {$result == 1} { - return "" + if { ([istarget "*-*-mingw*"] + || [istarget *-*-cygwin*]) } { + set objdump_program [gdb_find_objdump] + set result [catch {set data [exec $objdump_program -p $filename | grep signature | cut "-d " -f4]} output] + verbose "result is $result" + verbose "output is $output" + if {$result == 1} { + return "" + } + return $data } - set fi [open $tmp] - fconfigure $fi -translation binary - # Skip the NOTE header. - read $fi 16 - set data [read $fi] - close $fi - file delete $tmp - if ![string compare $data ""] then { - return "" + else + { + set tmp [standard_output_file "${filename}-tmp"] + set objcopy_program [gdb_find_objcopy] + set result [catch "exec $objcopy_program -j .note.gnu.build-id -O binary $filename $tmp" output] + verbose "result is $result" + verbose "output is $output" + if {$result == 1} { + return "" + } + set fi [open $tmp] + fconfigure $fi -translation binary + # Skip the NOTE header. + read $fi 16 + set data [read $fi] + close $fi + file delete $tmp + if ![string compare $data ""] then { + return "" + } + # Convert it to hex. + binary scan $data H* data + return $data } - # Convert it to hex. - binary scan $data H* data - return $data } # Return the build-id hex string (usually 160 bits as 40 hex characters) -- 2.1.4 ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] Find debug symbols file by buildid for PE file format also 2015-04-08 12:17 ` [PATCH] Find debug symbols file by buildid for PE " Jon TURNEY @ 2015-04-08 12:39 ` Eli Zaretskii 2015-04-22 13:41 ` Jon TURNEY ` (2 subsequent siblings) 3 siblings, 0 replies; 16+ messages in thread From: Eli Zaretskii @ 2015-04-08 12:39 UTC (permalink / raw) To: Jon TURNEY; +Cc: gdb-patches > Date: Wed, 08 Apr 2015 13:17:09 +0100 > From: Jon TURNEY <jon.turney@dronecode.org.uk> > > >>> 2015-03-14 Jon TURNEY <jon.turney@dronecode.org.uk> > >>> > >>> * gdb.texinfo (Separate Debug Files): Document that COFF is also > >>> supported. > >> > >> The gdb.texinfo part is OK, except that AFAIK PE is not the same as > >> COFF, so I suggest to amend the ChangeLog entry above. > > > > Yes, this should say PE in the ChangeLog (and subject). > > Updated patch attached. The documentation part is OK, thanks. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] Find debug symbols file by buildid for PE file format also 2015-04-08 12:17 ` [PATCH] Find debug symbols file by buildid for PE " Jon TURNEY 2015-04-08 12:39 ` Eli Zaretskii @ 2015-04-22 13:41 ` Jon TURNEY 2015-06-02 13:33 ` Jon TURNEY 2015-06-09 19:36 ` Joel Brobecker 3 siblings, 0 replies; 16+ messages in thread From: Jon TURNEY @ 2015-04-22 13:41 UTC (permalink / raw) To: gdb-patches On 08/04/2015 13:17, Jon TURNEY wrote: > On 17/03/2015 12:56, Jon TURNEY wrote: >> On 16/03/2015 16:30, Eli Zaretskii wrote: >> [...] >>>> >>>> gdb/doc/ChangeLog: >>>> >>>> 2015-03-14 Jon TURNEY <jon.turney@dronecode.org.uk> >>>> >>>> * gdb.texinfo (Separate Debug Files): Document that COFF is also >>>> supported. >>> >>> The gdb.texinfo part is OK, except that AFAIK PE is not the same as >>> COFF, so I suggest to amend the ChangeLog entry above. >> >> Yes, this should say PE in the ChangeLog (and subject). > > Updated patch attached. Ping? ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] Find debug symbols file by buildid for PE file format also 2015-04-08 12:17 ` [PATCH] Find debug symbols file by buildid for PE " Jon TURNEY 2015-04-08 12:39 ` Eli Zaretskii 2015-04-22 13:41 ` Jon TURNEY @ 2015-06-02 13:33 ` Jon TURNEY 2015-06-09 19:36 ` Joel Brobecker 3 siblings, 0 replies; 16+ messages in thread From: Jon TURNEY @ 2015-06-02 13:33 UTC (permalink / raw) To: gdb-patches On 08/04/2015 13:17, Jon TURNEY wrote: > On 17/03/2015 12:56, Jon TURNEY wrote: >> On 16/03/2015 16:30, Eli Zaretskii wrote: >> [...] >>>> >>>> gdb/doc/ChangeLog: >>>> >>>> 2015-03-14 Jon TURNEY <jon.turney@dronecode.org.uk> >>>> >>>> * gdb.texinfo (Separate Debug Files): Document that COFF is also >>>> supported. >>> >>> The gdb.texinfo part is OK, except that AFAIK PE is not the same as >>> COFF, so I suggest to amend the ChangeLog entry above. >> >> Yes, this should say PE in the ChangeLog (and subject). > > Updated patch attached. Ping? ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] Find debug symbols file by buildid for PE file format also 2015-04-08 12:17 ` [PATCH] Find debug symbols file by buildid for PE " Jon TURNEY ` (2 preceding siblings ...) 2015-06-02 13:33 ` Jon TURNEY @ 2015-06-09 19:36 ` Joel Brobecker 2015-06-10 14:26 ` [PATCH] Allow gdb to find debug symbols file by build-id " Jon Turney 3 siblings, 1 reply; 16+ messages in thread From: Joel Brobecker @ 2015-06-09 19:36 UTC (permalink / raw) To: Jon TURNEY; +Cc: gdb-patches > bfd/ChangeLog: > > 2015-04-07 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(). The BFD part of the patch needs to be approved by the binutils maintainers. > gdb/ChangeLog: > > 2015-04-07 Jon Turney <jon.turney@dronecode.org.uk> > > * build-id.c (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 (objfpy_get_build_id) > (objfpy_build_id_matches, objfpy_lookup_objfile_by_build_id): Ditto. > * coffread.c (coff_symfile_read): Try > find_separate_debug_file_by_buildid. Can you also mention in the ChangeLog the #include changes (removing and adding)? > > gdb/doc/ChangeLog: > > 2015-04-07 Jon Turney <jon.turney@dronecode.org.uk> > > * gdb.texinfo (Separate Debug Files): Document that PE is also > supported. > > gdb/testsuite/ChangeLog: > > 2015-04-07 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. All GDB changes look mostly OK to me. In fact, the only comments are very minor in nature, so this part is pre-approved pending those tiny issues being addressed. > @@ -29,19 +28,19 @@ > > /* 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; > + } Small GDB-specific coding style: For single-statement if blocks, we decided that curly braces should not be used. Therefore: if (abfd->build_id != NULL) return abfd->build_id; The only exception is when you have a comment in addition to the statement. See: https://sourceware.org/gdb/wiki/Internals%20GDB-C-Coding-Standards > diff --git a/gdb/testsuite/lib/future.exp b/gdb/testsuite/lib/future.exp > index 2fb635b..fd4c153 100644 > --- a/gdb/testsuite/lib/future.exp > +++ b/gdb/testsuite/lib/future.exp > @@ -104,6 +104,16 @@ proc gdb_find_objcopy {} { > return $objcopy > } > > +proc gdb_find_objdump {} { We should document every new function, by adding an introductory comment. -- Joel ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH] Allow gdb to find debug symbols file by build-id for PE file format also 2015-06-09 19:36 ` Joel Brobecker @ 2015-06-10 14:26 ` Jon Turney 2015-06-12 15:45 ` Nicholas Clifton ` (2 more replies) 0 siblings, 3 replies; 16+ messages in thread From: Jon Turney @ 2015-06-10 14:26 UTC (permalink / raw) To: binutils, gdb-patches; +Cc: Jon Turney 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> --- bfd/ChangeLog | 12 +++++ bfd/bfd-in2.h | 9 ++++ bfd/bfd.c | 9 ++++ bfd/elf-bfd.h | 10 ---- bfd/elf.c | 12 ++--- bfd/libpei.h | 4 ++ bfd/peXXigen.c | 2 +- bfd/peicode.h | 100 ++++++++++++++++++++++++++++++++++-- gdb/ChangeLog | 13 +++++ gdb/build-id.c | 21 ++++---- gdb/build-id.h | 2 +- gdb/coffread.c | 6 ++- gdb/doc/ChangeLog | 5 ++ gdb/doc/gdb.texinfo | 2 +- gdb/python/py-objfile.c | 7 ++- gdb/testsuite/ChangeLog | 7 +++ gdb/testsuite/gdb.base/sepdebug.exp | 12 ++--- gdb/testsuite/lib/future.exp | 11 ++++ gdb/testsuite/lib/gdb.exp | 53 +++++++++++-------- 19 files changed, 231 insertions(+), 66 deletions(-) diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 09331bd..c98e4bd 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -6322,6 +6322,12 @@ enum bfd_plugin_format bfd_plugin_no = 2 }; +struct bfd_build_id + { + size_t size; + bfd_byte data[1]; + }; + struct bfd { /* The filename the application opened the BFD with. */ @@ -6606,6 +6612,9 @@ struct bfd struct objalloc *, but we use void * to avoid requiring the inclusion of objalloc.h. */ void *memory; + + /* For input BFDs, the build ID, if the object has one. */ + const struct bfd_build_id *build_id; }; /* See note beside bfd_set_section_userdata. */ diff --git a/bfd/bfd.c b/bfd/bfd.c index ab410cb..e60f358 100644 --- a/bfd/bfd.c +++ b/bfd/bfd.c @@ -51,6 +51,12 @@ CODE_FRAGMENT . bfd_plugin_no = 2 . }; . +.struct bfd_build_id +. { +. size_t size; +. bfd_byte data[1]; +. }; +. .struct bfd .{ . {* The filename the application opened the BFD with. *} @@ -335,6 +341,9 @@ CODE_FRAGMENT . struct objalloc *, but we use void * to avoid requiring the inclusion . of objalloc.h. *} . void *memory; +. +. {* For input BFDs, the build ID, if the object has one. *} +. const struct bfd_build_id *build_id; .}; . .{* See note beside bfd_set_section_userdata. *} diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 9807fe7..1127b7e 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -1563,13 +1563,6 @@ struct sdt_note bfd_byte data[1]; }; -/* NT_GNU_BUILD_ID note type info for input BFDs. */ -struct elf_build_id -{ - size_t size; - bfd_byte data[1]; -}; - /* tdata information grabbed from an elf core file. */ struct core_elf_obj_tdata { @@ -1704,9 +1697,6 @@ struct elf_obj_tdata obj_attribute known_obj_attributes[2][NUM_KNOWN_OBJ_ATTRIBUTES]; obj_attribute_list *other_obj_attributes[2]; - /* NT_GNU_BUILD_ID note type. */ - struct elf_build_id *build_id; - /* Linked-list containing information about every Systemtap section found in the object file. Each section corresponds to one entry in the list. */ diff --git a/bfd/elf.c b/bfd/elf.c index 619a640..47638f4 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -9116,18 +9116,18 @@ elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note) static bfd_boolean elfobj_grok_gnu_build_id (bfd *abfd, Elf_Internal_Note *note) { - struct elf_obj_tdata *t; + struct bfd_build_id* build_id; if (note->descsz == 0) return FALSE; - t = elf_tdata (abfd); - t->build_id = bfd_alloc (abfd, sizeof (*t->build_id) - 1 + note->descsz); - if (t->build_id == NULL) + build_id = bfd_alloc (abfd, sizeof (struct bfd_build_id) - 1 + note->descsz); + if (build_id == NULL) return FALSE; - t->build_id->size = note->descsz; - memcpy (t->build_id->data, note->descdata, note->descsz); + build_id->size = note->descsz; + memcpy (build_id->data, note->descdata, note->descsz); + abfd->build_id = build_id; return TRUE; } diff --git a/bfd/libpei.h b/bfd/libpei.h index d19a3b2..a6f3da0 100644 --- a/bfd/libpei.h +++ b/bfd/libpei.h @@ -238,6 +238,7 @@ #define _bfd_XXi_swap_debugdir_in _bfd_pex64i_swap_debugdir_in #define _bfd_XXi_swap_debugdir_out _bfd_pex64i_swap_debugdir_out #define _bfd_XXi_write_codeview_record _bfd_pex64i_write_codeview_record +#define _bfd_XXi_slurp_codeview_record _bfd_pex64i_slurp_codeview_record #elif defined COFF_WITH_pep @@ -272,6 +273,7 @@ #define _bfd_XXi_swap_debugdir_in _bfd_pepi_swap_debugdir_in #define _bfd_XXi_swap_debugdir_out _bfd_pepi_swap_debugdir_out #define _bfd_XXi_write_codeview_record _bfd_pepi_write_codeview_record +#define _bfd_XXi_slurp_codeview_record _bfd_pepi_slurp_codeview_record #else /* !COFF_WITH_pep */ @@ -306,6 +308,7 @@ #define _bfd_XXi_swap_debugdir_in _bfd_pei_swap_debugdir_in #define _bfd_XXi_swap_debugdir_out _bfd_pei_swap_debugdir_out #define _bfd_XXi_write_codeview_record _bfd_pei_write_codeview_record +#define _bfd_XXi_slurp_codeview_record _bfd_pei_slurp_codeview_record #endif /* !COFF_WITH_pep */ @@ -351,6 +354,7 @@ bfd_boolean _bfd_XXi_final_link_postscript (bfd *, struct coff_final_link_info * void _bfd_XXi_swap_debugdir_in (bfd *, void *, void *); unsigned _bfd_XXi_swap_debugdir_out (bfd *, void *, void *); unsigned _bfd_XXi_write_codeview_record (bfd *, file_ptr, CODEVIEW_INFO *); +CODEVIEW_INFO * _bfd_XXi_slurp_codeview_record (bfd * abfd, file_ptr where, unsigned long length, CODEVIEW_INFO *cvinfo); /* The following are needed only for ONE of pe or pei, but don't otherwise vary; peicode.h fixes up ifdefs but we provide the diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c index c897c64..d209b50 100644 --- a/bfd/peXXigen.c +++ b/bfd/peXXigen.c @@ -1140,7 +1140,7 @@ _bfd_XXi_swap_debugdir_out (bfd * abfd, void * inp, void * extp) return sizeof (struct external_IMAGE_DEBUG_DIRECTORY); } -static CODEVIEW_INFO * +CODEVIEW_INFO * _bfd_XXi_slurp_codeview_record (bfd * abfd, file_ptr where, unsigned long length, CODEVIEW_INFO *cvinfo) { char buffer[256+1]; diff --git a/bfd/peicode.h b/bfd/peicode.h index 200ef5e..06bcaa9 100644 --- a/bfd/peicode.h +++ b/bfd/peicode.h @@ -1255,6 +1255,87 @@ pe_ILF_object_p (bfd * abfd) return abfd->xvec; } +static void +pe_bfd_read_buildid(bfd *abfd) +{ + pe_data_type *pe = pe_data (abfd); + struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr; + asection *section; + bfd_byte *data = 0; + bfd_size_type dataoff; + unsigned int i; + + bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress; + bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size; + + if (size == 0) + return; + + addr += extra->ImageBase; + + /* Search for the section containing the DebugDirectory */ + for (section = abfd->sections; section != NULL; section = section->next) + { + if ((addr >= section->vma) && (addr < (section->vma + section->size))) + break; + } + + if (section == NULL) + { + return; + } + else if (!(section->flags & SEC_HAS_CONTENTS)) + { + return; + } + + dataoff = addr - section->vma; + + /* Read the whole section. */ + if (!bfd_malloc_and_get_section (abfd, section, &data)) + { + if (data != NULL) + free (data); + return; + } + + /* Search for a CodeView entry in the DebugDirectory */ + for (i = 0; i < size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++) + { + struct external_IMAGE_DEBUG_DIRECTORY *ext + = &((struct external_IMAGE_DEBUG_DIRECTORY *)(data + dataoff))[i]; + struct internal_IMAGE_DEBUG_DIRECTORY idd; + + _bfd_XXi_swap_debugdir_in (abfd, ext, &idd); + + if (idd.Type == PE_IMAGE_DEBUG_TYPE_CODEVIEW) + { + char buffer[256 + 1]; + CODEVIEW_INFO *cvinfo = (CODEVIEW_INFO *) buffer; + + /* + The debug entry doesn't have to have to be in a section, in which + case AddressOfRawData is 0, so always use PointerToRawData. + */ + if (_bfd_XXi_slurp_codeview_record (abfd, + (file_ptr) idd.PointerToRawData, + idd.SizeOfData, cvinfo)) + { + struct bfd_build_id* build_id = bfd_alloc(abfd, + sizeof(struct bfd_build_id) + cvinfo->SignatureLength); + if (build_id) + { + build_id->size = cvinfo->SignatureLength; + memcpy(build_id->data, cvinfo->Signature, + cvinfo->SignatureLength); + abfd->build_id = build_id; + } + } + break; + } + } +} + static const bfd_target * pe_bfd_object_p (bfd * abfd) { @@ -1265,6 +1346,7 @@ pe_bfd_object_p (bfd * abfd) struct internal_aouthdr internal_a; file_ptr opt_hdr_size; file_ptr offset; + const bfd_target *result; /* Detect if this a Microsoft Import Library Format element. */ /* First read the beginning of the header. */ @@ -1358,10 +1440,20 @@ pe_bfd_object_p (bfd * abfd) return NULL; } - return coff_real_object_p (abfd, internal_f.f_nscns, &internal_f, - (opt_hdr_size != 0 - ? &internal_a - : (struct internal_aouthdr *) NULL)); + + result = coff_real_object_p (abfd, internal_f.f_nscns, &internal_f, + (opt_hdr_size != 0 + ? &internal_a + : (struct internal_aouthdr *) NULL)); + + + if (result) + { + /* Now the whole header has been processed, see if there is a build-id */ + pe_bfd_read_buildid(abfd); + } + + return result; } #define coff_object_p pe_bfd_object_p 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) diff --git a/gdb/build-id.h b/gdb/build-id.h index f77dda2..bea761b 100644 --- a/gdb/build-id.h +++ b/gdb/build-id.h @@ -22,7 +22,7 @@ /* Locate NT_GNU_BUILD_ID from ABFD and return its content. */ -extern const struct elf_build_id *build_id_bfd_get (bfd *abfd); +extern const struct bfd_build_id *build_id_bfd_get (bfd *abfd); /* Return true if ABFD has NT_GNU_BUILD_ID matching the CHECK value. Otherwise, issue a warning and return false. */ diff --git a/gdb/coffread.c b/gdb/coffread.c index 3b5a968..7722cdb 100644 --- a/gdb/coffread.c +++ b/gdb/coffread.c @@ -41,6 +41,7 @@ #include "coff-pe-read.h" #include "psymtab.h" +#include "build-id.h" extern void _initialize_coffread (void); @@ -738,7 +739,10 @@ coff_symfile_read (struct objfile *objfile, int symfile_flags) { char *debugfile; - debugfile = find_separate_debug_file_by_debuglink (objfile); + debugfile = find_separate_debug_file_by_buildid (objfile); + + if (debugfile == NULL) + debugfile = find_separate_debug_file_by_debuglink (objfile); make_cleanup (xfree, debugfile); if (debugfile) diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 9e9138b..9d9685f 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -18170,7 +18170,7 @@ the executable and the debug file came from the same build. @item The executable contains a @dfn{build ID}, a unique bit string that is also present in the corresponding debug info file. (This is supported -only on some operating systems, notably those which use the ELF format +only on some operating systems, when using the ELF or PE file formats for binary files and the @sc{gnu} Binutils.) For more details about this feature, see the description of the @option{--build-id} command-line option in @ref{Options, , Command Line Options, ld.info, diff --git a/gdb/python/py-objfile.c b/gdb/python/py-objfile.c index c9528c3..5dc9ae6 100644 --- a/gdb/python/py-objfile.c +++ b/gdb/python/py-objfile.c @@ -23,7 +23,6 @@ #include "objfiles.h" #include "language.h" #include "build-id.h" -#include "elf-bfd.h" #include "symtab.h" typedef struct @@ -134,7 +133,7 @@ objfpy_get_build_id (PyObject *self, void *closure) { objfile_object *obj = (objfile_object *) self; struct objfile *objfile = obj->objfile; - const struct elf_build_id *build_id = NULL; + const struct bfd_build_id *build_id = NULL; OBJFPY_REQUIRE_VALID (obj); @@ -484,7 +483,7 @@ objfpy_build_id_ok (const char *string) It is assumed that objfpy_build_id_ok (string) returns TRUE. */ static int -objfpy_build_id_matches (const struct elf_build_id *build_id, +objfpy_build_id_matches (const struct bfd_build_id *build_id, const char *string) { size_t i; @@ -542,7 +541,7 @@ objfpy_lookup_objfile_by_build_id (const char *build_id) ALL_OBJFILES (objfile) { - const struct elf_build_id *obfd_build_id; + const struct bfd_build_id *obfd_build_id; if (objfile->obfd == NULL) continue; diff --git a/gdb/testsuite/gdb.base/sepdebug.exp b/gdb/testsuite/gdb.base/sepdebug.exp index 3194377..c363be4 100644 --- a/gdb/testsuite/gdb.base/sepdebug.exp +++ b/gdb/testsuite/gdb.base/sepdebug.exp @@ -42,7 +42,7 @@ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {deb # the name of a debuginfo only file. This file will be stored in the # gdb.base/ subdirectory. -if [gdb_gnu_strip_debug $binfile] { +if [gdb_gnu_strip_debug $binfile$EXEEXT] { # check that you have a recent version of strip and objcopy installed unsupported "cannot produce separate debug info files" return -1 @@ -60,7 +60,7 @@ set new_name [standard_output_file ${testfile}${EXEEXT}] remote_exec build "rm -rf [file dirname $new_name]" remote_exec build "mkdir [file dirname $new_name]" -remote_exec build "ln -s ${binfile} $new_name" +remote_exec build "ln -s ${binfile}${EXEEXT} $new_name" clean_restart ${testfile}${EXEEXT} if { $gdb_file_cmd_debug_info != "debug" } then { fail "No debug information found." @@ -716,10 +716,10 @@ proc test_different_dir {type test_different_dir xfail} { # the "set debug-file-directory" command. set different_dir [standard_output_file ${testfile}.dir] -set debugfile "${different_dir}/[standard_output_file ${testfile}.debug]" +set debugfile "${different_dir}/[standard_output_file ${testfile}${EXEEXT}.debug]" remote_exec build "rm -rf $different_dir" remote_exec build "mkdir -p [file dirname $debugfile]" -remote_exec build "mv -f [standard_output_file ${testfile}.debug] $debugfile" +remote_exec build "mv -f [standard_output_file ${testfile}${EXEEXT}.debug] $debugfile" test_different_dir debuglink $different_dir 0 @@ -727,7 +727,7 @@ test_different_dir debuglink $different_dir 0 # Test CRC mismatch is reported. if {[build_executable sepdebug.exp sepdebug2 sepdebug2.c debug] != -1 - && ![gdb_gnu_strip_debug [standard_output_file sepdebug2]]} { + && ![gdb_gnu_strip_debug [standard_output_file sepdebug2]$EXEEXT]} { remote_exec build "cp ${debugfile} [standard_output_file sepdebug2.debug]" @@ -743,7 +743,7 @@ if {[build_executable sepdebug.exp sepdebug2 sepdebug2.c debug] != -1 # NT_GNU_BUILD_ID / .note.gnu.build-id test: -set build_id_debug_filename [build_id_debug_filename_get $binfile] +set build_id_debug_filename [build_id_debug_filename_get $binfile$EXEEXT] if ![string compare $build_id_debug_filename ""] then { unsupported "build-id is not supported by the compiler" diff --git a/gdb/testsuite/lib/future.exp b/gdb/testsuite/lib/future.exp index 2fb635b..a27e120 100644 --- a/gdb/testsuite/lib/future.exp +++ b/gdb/testsuite/lib/future.exp @@ -104,6 +104,17 @@ proc gdb_find_objcopy {} { return $objcopy } +# find target objdump +proc gdb_find_objdump {} { + global OBJDUMP_FOR_TARGET + if [info exists OBJDUMP_FOR_TARGET] { + set objdump $OBJDUMP_FOR_TARGET + } else { + set objdump [transform objdump] + } + return $objdump +} + proc gdb_find_readelf {} { global READELF_FOR_TARGET if [info exists READELF_FOR_TARGET] { diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index 41797e7..21a4638 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -4539,28 +4539,41 @@ gdb_caching_proc gdb_has_argv0 { # Returns "" if there is none. proc get_build_id { filename } { - set tmp [standard_output_file "${filename}-tmp"] - set objcopy_program [gdb_find_objcopy] - - set result [catch "exec $objcopy_program -j .note.gnu.build-id -O binary $filename $tmp" output] - verbose "result is $result" - verbose "output is $output" - if {$result == 1} { - return "" + if { ([istarget "*-*-mingw*"] + || [istarget *-*-cygwin*]) } { + set objdump_program [gdb_find_objdump] + set result [catch {set data [exec $objdump_program -p $filename | grep signature | cut "-d " -f4]} output] + verbose "result is $result" + verbose "output is $output" + if {$result == 1} { + return "" + } + return $data } - set fi [open $tmp] - fconfigure $fi -translation binary - # Skip the NOTE header. - read $fi 16 - set data [read $fi] - close $fi - file delete $tmp - if ![string compare $data ""] then { - return "" + else + { + set tmp [standard_output_file "${filename}-tmp"] + set objcopy_program [gdb_find_objcopy] + set result [catch "exec $objcopy_program -j .note.gnu.build-id -O binary $filename $tmp" output] + verbose "result is $result" + verbose "output is $output" + if {$result == 1} { + return "" + } + set fi [open $tmp] + fconfigure $fi -translation binary + # Skip the NOTE header. + read $fi 16 + set data [read $fi] + close $fi + file delete $tmp + if ![string compare $data ""] then { + return "" + } + # Convert it to hex. + binary scan $data H* data + return $data } - # Convert it to hex. - binary scan $data H* data - return $data } # Return the build-id hex string (usually 160 bits as 40 hex characters) -- 2.1.4 ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] Allow gdb to find debug symbols file by build-id for PE file format also 2015-06-10 14:26 ` [PATCH] Allow gdb to find debug symbols file by build-id " Jon Turney @ 2015-06-12 15:45 ` Nicholas Clifton 2015-06-15 16:34 ` Mike Frysinger 2015-06-17 16:09 ` Yao Qi 2 siblings, 0 replies; 16+ messages in thread From: Nicholas Clifton @ 2015-06-12 15:45 UTC (permalink / raw) To: Jon Turney, binutils, gdb-patches Hi Jon, > 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(). This part of the patch is approved. Please apply when you have time. Cheers Nick ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] Allow gdb to find debug symbols file by build-id for PE file format also 2015-06-10 14:26 ` [PATCH] Allow gdb to find debug symbols file by build-id " Jon Turney 2015-06-12 15:45 ` Nicholas Clifton @ 2015-06-15 16:34 ` Mike Frysinger 2015-06-15 18:13 ` Andreas Schwab 2015-06-17 16:09 ` Yao Qi 2 siblings, 1 reply; 16+ messages in thread From: Mike Frysinger @ 2015-06-15 16:34 UTC (permalink / raw) To: Jon Turney; +Cc: binutils, gdb-patches [-- Attachment #1: Type: text/plain, Size: 909 bytes --] On 10 Jun 2015 15:25, Jon Turney wrote: > --- a/bfd/bfd-in2.h > +++ b/bfd/bfd-in2.h > @@ -6322,6 +6322,12 @@ enum bfd_plugin_format > bfd_plugin_no = 2 > }; > > +struct bfd_build_id > + { > + size_t size; > + bfd_byte data[1]; > + }; the use of size_t here breaks a number of targets because this header doesn't include the header which provides the definition for it. it happens to work for some due to other files pulling in the right headers, but it's still broken. i don't know what the policy is here in this header as it seems to isolate itself from the OS quite a bit. In file included from ../../../../sim/erc32/../../include/gdb/callback.h:55:0, from ../../../../sim/erc32/sis.h:18, from ../../../../sim/erc32/exec.c:20: ../../bfd/bfd.h:6332:5: error: unknown type name ‘size_t’ size_t size; ^ -mike [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] Allow gdb to find debug symbols file by build-id for PE file format also 2015-06-15 16:34 ` Mike Frysinger @ 2015-06-15 18:13 ` Andreas Schwab 2015-06-15 18:25 ` Jon TURNEY 0 siblings, 1 reply; 16+ messages in thread From: Andreas Schwab @ 2015-06-15 18:13 UTC (permalink / raw) To: Jon Turney; +Cc: binutils, gdb-patches Mike Frysinger <vapier@gentoo.org> writes: > don't know what the policy is here in this header It should use bfd_size_type. Andreas. -- Andreas Schwab, schwab@linux-m68k.org GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different." ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] Allow gdb to find debug symbols file by build-id for PE file format also 2015-06-15 18:13 ` Andreas Schwab @ 2015-06-15 18:25 ` Jon TURNEY 2015-06-16 11:35 ` Nicholas Clifton 0 siblings, 1 reply; 16+ messages in thread From: Jon TURNEY @ 2015-06-15 18:25 UTC (permalink / raw) To: Andreas Schwab; +Cc: binutils, gdb-patches [-- Attachment #1: Type: text/plain, Size: 196 bytes --] On 15/06/2015 19:13, Andreas Schwab wrote: > Mike Frysinger <vapier@gentoo.org> writes: > >> don't know what the policy is here in this header > > It should use bfd_size_type. Patch attached. [-- Attachment #2: 0001-Fix-build-when-size_t-is-not-available-in-bfd-in2.h.patch --] [-- Type: text/plain, Size: 1452 bytes --] From 9c96da937babaedd5b23ae352359c3caaf8524ad Mon Sep 17 00:00:00 2001 From: Jon Turney <jon.turney@dronecode.org.uk> Date: Mon, 15 Jun 2015 19:20:02 +0100 Subject: [PATCH] Fix build when size_t is not available in bfd-in2.h bfd/ChangeLog: 2015-06-15 Jon Turney <jon.turney@dronecode.org.uk> * bfd.c: Change struct bfd_build_id to use bfd_size_type. * bfd-in2.h : Regenerate. Signed-off-by: Jon Turney <jon.turney@dronecode.org.uk> --- bfd/ChangeLog | 5 +++++ bfd/bfd-in2.h | 2 +- bfd/bfd.c | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 886da5b..265cc41f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2015-06-15 Jon Turney <jon.turney@dronecode.org.uk> + + * bfd.c: Change struct bfd_build_id to use bfd_size_type. + * bfd-in2.h : Regenerate. + 2015-06-10 Jon Turney <jon.turney@dronecode.org.uk> * elf-bfd.h : Remove struct elf_build_id. diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index dfffe3c..2d32c74 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -6328,7 +6328,7 @@ enum bfd_plugin_format struct bfd_build_id { - size_t size; + bfd_size_type size; bfd_byte data[1]; }; diff --git a/bfd/bfd.c b/bfd/bfd.c index e60f358..8d85de5 100644 --- a/bfd/bfd.c +++ b/bfd/bfd.c @@ -53,7 +53,7 @@ CODE_FRAGMENT . .struct bfd_build_id . { -. size_t size; +. bfd_size_type size; . bfd_byte data[1]; . }; . -- 2.1.4 ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] Allow gdb to find debug symbols file by build-id for PE file format also 2015-06-15 18:25 ` Jon TURNEY @ 2015-06-16 11:35 ` Nicholas Clifton 0 siblings, 0 replies; 16+ messages in thread From: Nicholas Clifton @ 2015-06-16 11:35 UTC (permalink / raw) To: Jon TURNEY, Andreas Schwab; +Cc: binutils, gdb-patches Hi Jon, >>> don't know what the policy is here in this header >> It should use bfd_size_type. > Patch attached. Patch approved - please apply. Cheers Nick ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] Allow gdb to find debug symbols file by build-id for PE file format also 2015-06-10 14:26 ` [PATCH] Allow gdb to find debug symbols file by build-id " Jon Turney 2015-06-12 15:45 ` Nicholas Clifton 2015-06-15 16:34 ` Mike Frysinger @ 2015-06-17 16:09 ` Yao Qi 2015-06-18 11:05 ` Jon TURNEY 2 siblings, 1 reply; 16+ messages in thread From: Yao Qi @ 2015-06-17 16:09 UTC (permalink / raw) To: Jon Turney; +Cc: binutils, gdb-patches Jon Turney <jon.turney@dronecode.org.uk> writes: > + return $data > } > - set fi [open $tmp] > - fconfigure $fi -translation binary > - # Skip the NOTE header. > - read $fi 16 > - set data [read $fi] > - close $fi > - file delete $tmp > - if ![string compare $data ""] then { > - return "" > + else > + { braces and "else" are put in the different lines. It causes the tcl error, Running ../../../binutils-gdb/gdb/testsuite/gdb.base/break-interp.exp ... ERROR: (DejaGnu) proc "else" does not exist. The error code is NONE The info on the error is: invalid command name "else" while executing "::tcl_unknown else" ("uplevel" body line 1) invoked from within "uplevel 1 ::tcl_unknown $args" Patch below fixes this error. I'll push it in. -- Yao (齐尧) From cff4a037399c6c24efc2d1404b9aa9bb27e520da Mon Sep 17 00:00:00 2001 From: Yao Qi <yao.qi@linaro.org> Date: Wed, 17 Jun 2015 17:03:03 +0100 Subject: [PATCH] Fix tcl error This patch fixes the following tcl error Running ../../../binutils-gdb/gdb/testsuite/gdb.base/break-interp.exp ... ERROR: (DejaGnu) proc "else" does not exist. The error code is NONE The info on the error is: invalid command name "else" while executing "::tcl_unknown else" ("uplevel" body line 1) invoked from within "uplevel 1 ::tcl_unknown $args" gdb/testsuite: 2015-06-17 Yao Qi <yao.qi@linaro.org> * lib/gdb.exp (get_build_id): Move braces and "else" to the same line. diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index 21a4638..b5928c3 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -4549,9 +4549,7 @@ proc get_build_id { filename } { return "" } return $data - } - else - { + } else { set tmp [standard_output_file "${filename}-tmp"] set objcopy_program [gdb_find_objcopy] set result [catch "exec $objcopy_program -j .note.gnu.build-id -O binary $filename $tmp" output] ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] Allow gdb to find debug symbols file by build-id for PE file format also 2015-06-17 16:09 ` Yao Qi @ 2015-06-18 11:05 ` Jon TURNEY 0 siblings, 0 replies; 16+ messages in thread From: Jon TURNEY @ 2015-06-18 11:05 UTC (permalink / raw) To: Yao Qi; +Cc: binutils, gdb-patches On 17/06/2015 17:09, Yao Qi wrote: > Jon Turney writes: > >> + return $data >> } >> - set fi [open $tmp] >> - fconfigure $fi -translation binary >> - # Skip the NOTE header. >> - read $fi 16 >> - set data [read $fi] >> - close $fi >> - file delete $tmp >> - if ![string compare $data ""] then { >> - return "" >> + else >> + { > > braces and "else" are put in the different lines. It causes the tcl > error, > > Running ../../../binutils-gdb/gdb/testsuite/gdb.base/break-interp.exp ... > ERROR: (DejaGnu) proc "else" does not exist. > The error code is NONE > The info on the error is: > invalid command name "else" > while executing > "::tcl_unknown else" > ("uplevel" body line 1) > invoked from within > "uplevel 1 ::tcl_unknown $args" > > Patch below fixes this error. I'll push it in. Thanks. ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2015-06-18 11:05 UTC | newest] Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2015-03-16 15:37 [PATCH] Find debug symbols file by buildid for coff file format also Jon TURNEY 2015-03-16 16:30 ` Eli Zaretskii 2015-03-17 12:56 ` Jon TURNEY 2015-04-08 12:17 ` [PATCH] Find debug symbols file by buildid for PE " Jon TURNEY 2015-04-08 12:39 ` Eli Zaretskii 2015-04-22 13:41 ` Jon TURNEY 2015-06-02 13:33 ` Jon TURNEY 2015-06-09 19:36 ` Joel Brobecker 2015-06-10 14:26 ` [PATCH] Allow gdb to find debug symbols file by build-id " Jon Turney 2015-06-12 15:45 ` Nicholas Clifton 2015-06-15 16:34 ` Mike Frysinger 2015-06-15 18:13 ` Andreas Schwab 2015-06-15 18:25 ` Jon TURNEY 2015-06-16 11:35 ` Nicholas Clifton 2015-06-17 16:09 ` Yao Qi 2015-06-18 11:05 ` Jon TURNEY
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).