aboutsummaryrefslogtreecommitdiff
path: root/gdb/osabi.c
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2012-11-08 19:52:42 +0000
committerTom Tromey <tromey@redhat.com>2012-11-08 19:52:42 +0000
commitea9f10bb87523d421e6c863a7ec66dfee41692b4 (patch)
tree4ffaabac48c8d7f9209e224d1de031c7db0f3406 /gdb/osabi.c
parentd071a26bbc15eff9beaa74baef98ffdf4ae2653d (diff)
downloadgdb-ea9f10bb87523d421e6c863a7ec66dfee41692b4.zip
gdb-ea9f10bb87523d421e6c863a7ec66dfee41692b4.tar.gz
gdb-ea9f10bb87523d421e6c863a7ec66dfee41692b4.tar.bz2
PR gdb/14704:
* gdb_bfd.c (gdb_bfd_ref): Set BFD_DECOMPRESS. (zlib_decompress_section): Remove. (gdb_bfd_map_section): Only check for compressed section in mmap case. Use bfd_get_full_section_contents. * 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. * py-auto-load.c (auto_load_section_scripts): Use bfd_get_full_section_contents. * contrib/cc-with-tweaks.sh: Add -Z option. testsuite * gdb.base/comprdebug.exp: New file.
Diffstat (limited to 'gdb/osabi.c')
-rw-r--r--gdb/osabi.c29
1 files changed, 22 insertions, 7 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;