[PATCH 2/3] lazily read note section data

Tom Tromey tromey@redhat.com
Tue Oct 23 17:27:00 GMT 2012


Tom> In the next patch, we'll set the BFD_DECOMPRESS flag, so that BFD will
Tom> know to decompress compressed sections.

This patch needed an update due to Kai's patch to BFD to make PE handle
compressed debug sections.

Here's the update.

Built and regtested on x86-64 Fedora 16.
I also sent the patch series to Kai for testing on Windows, and he
reported that it was ok.

	* osabi.c (check_note): Add 'sectsize' argument.  Read
	section data.
	(generic_elf_osabi_sniff_abi_tag_sections): Don't read
	section data.  Update for check_note change.
	* xcoffread.c (xcoff_initial_scan): Use
	bfd_get_full_section_contents.
---
 gdb/osabi.c     |   29 ++++++++++++++++++++++-------
 gdb/xcoffread.c |    8 +++-----
 2 files changed, 25 insertions(+), 12 deletions(-)

diff --git a/gdb/osabi.c b/gdb/osabi.c
index faffe30..7f60984 100644
--- a/gdb/osabi.c
+++ b/gdb/osabi.c
@@ -370,14 +370,23 @@ gdbarch_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
 /* Limit on the amount of data to be read.  */
 #define MAX_NOTESZ	128
 
-/* Return non-zero if NOTE matches NAME, DESCSZ and TYPE.  */
+/* Return non-zero if NOTE matches NAME, DESCSZ and TYPE.  If
+   *SECTSIZE is non-zero, then this reads that many bytes from
+   the start of the section and clears *SECTSIZE.  */
 
 static int
-check_note (bfd *abfd, asection *sect, const char *note,
+check_note (bfd *abfd, asection *sect, char *note, unsigned int *sectsize,
 	    const char *name, unsigned long descsz, unsigned long type)
 {
   unsigned long notesz;
 
+  if (*sectsize)
+    {
+      if (!bfd_get_section_contents (abfd, sect, note, 0, *sectsize))
+	return 0;
+      *sectsize = 0;
+    }
+
   /* Calculate the size of this note.  */
   notesz = strlen (name) + 1;
   notesz = ((notesz + 3) & ~3);
@@ -424,14 +433,18 @@ generic_elf_osabi_sniff_abi_tag_sections (bfd *abfd, asection *sect, void *obj)
   if (sectsize > MAX_NOTESZ)
     sectsize = MAX_NOTESZ;
 
+  /* We lazily read the section data here.  Since we use
+     BFD_DECOMPRESS, we can't use bfd_get_section_contents on a
+     compressed section.  But, since note sections are not compressed,
+     deferring the reading until we recognize the section avoids any
+     error.  */
   note = alloca (sectsize);
-  bfd_get_section_contents (abfd, sect, note, 0, sectsize);
 
   /* .note.ABI-tag notes, used by GNU/Linux and FreeBSD.  */
   if (strcmp (name, ".note.ABI-tag") == 0)
     {
       /* GNU.  */
-      if (check_note (abfd, sect, note, "GNU", 16, NT_GNU_ABI_TAG))
+      if (check_note (abfd, sect, note, &sectsize, "GNU", 16, NT_GNU_ABI_TAG))
 	{
 	  unsigned int abi_tag = bfd_h_get_32 (abfd, note + 16);
 
@@ -467,7 +480,8 @@ generic_elf_osabi_sniff_abi_tag_sections (bfd *abfd, asection *sect, void *obj)
 	}
 
       /* FreeBSD.  */
-      if (check_note (abfd, sect, note, "FreeBSD", 4, NT_FREEBSD_ABI_TAG))
+      if (check_note (abfd, sect, note, &sectsize, "FreeBSD", 4,
+		      NT_FREEBSD_ABI_TAG))
 	{
 	  /* There is no need to check the version yet.  */
 	  *osabi = GDB_OSABI_FREEBSD_ELF;
@@ -479,7 +493,7 @@ generic_elf_osabi_sniff_abi_tag_sections (bfd *abfd, asection *sect, void *obj)
       
   /* .note.netbsd.ident notes, used by NetBSD.  */
   if (strcmp (name, ".note.netbsd.ident") == 0
-      && check_note (abfd, sect, note, "NetBSD", 4, NT_NETBSD_IDENT))
+      && check_note (abfd, sect, note, &sectsize, "NetBSD", 4, NT_NETBSD_IDENT))
     {
       /* There is no need to check the version yet.  */
       *osabi = GDB_OSABI_NETBSD_ELF;
@@ -488,7 +502,8 @@ generic_elf_osabi_sniff_abi_tag_sections (bfd *abfd, asection *sect, void *obj)
 
   /* .note.openbsd.ident notes, used by OpenBSD.  */
   if (strcmp (name, ".note.openbsd.ident") == 0
-      && check_note (abfd, sect, note, "OpenBSD", 4, NT_OPENBSD_IDENT))
+      && check_note (abfd, sect, note, &sectsize, "OpenBSD", 4,
+		     NT_OPENBSD_IDENT))
     {
       /* There is no need to check the version yet.  */
       *osabi = GDB_OSABI_OPENBSD_ELF;
diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c
index af93a43..e4d0861 100644
--- a/gdb/xcoffread.c
+++ b/gdb/xcoffread.c
@@ -2989,7 +2989,7 @@ xcoff_initial_scan (struct objfile *objfile, int symfile_flags)
       {
 	struct bfd_section *secp;
 	bfd_size_type length;
-	char *debugsec = NULL;
+	bfd_byte *debugsec = NULL;
 
 	secp = bfd_get_section_by_name (abfd, ".debug");
 	if (secp)
@@ -2997,11 +2997,9 @@ xcoff_initial_scan (struct objfile *objfile, int symfile_flags)
 	    length = bfd_section_size (abfd, secp);
 	    if (length)
 	      {
-		debugsec =
-		  (char *) obstack_alloc (&objfile->objfile_obstack, length);
+		debugsec = obstack_alloc (&objfile->objfile_obstack, length);
 
-		if (!bfd_get_section_contents (abfd, secp, debugsec,
-					       (file_ptr) 0, length))
+		if (!bfd_get_full_section_contents (abfd, secp, &debugsec))
 		  {
 		    error (_("Error reading .debug section of `%s': %s"),
 			   name, bfd_errmsg (bfd_get_error ()));
-- 
1.7.7.6



More information about the Gdb-patches mailing list