public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [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).