This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH 2/3] lazily read note section data
- From: Tom Tromey <tromey at redhat dot com>
- To: gdb-patches at sourceware dot org
- Date: Tue, 23 Oct 2012 11:27:44 -0600
- Subject: Re: [PATCH 2/3] lazily read note section data
- References: <87obk26t4i.fsf@fleche.redhat.com>
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, §size, "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, §size, "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, §size, "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, §size, "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