Index: gdb/osabi.c |
diff --git a/gdb/osabi.c b/gdb/osabi.c |
index faffe30b448f7eda9b47f7b2b5f13a72a7883f1a..a170974d641bad6c1e4600a7bbbe13c0b517db65 100644 |
--- a/gdb/osabi.c |
+++ b/gdb/osabi.c |
@@ -1,6 +1,6 @@ |
/* OS ABI variant handling for GDB. |
- Copyright (C) 2001-2004, 2007-2012 Free Software Foundation, Inc. |
+ Copyright (C) 2001-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
@@ -20,7 +20,7 @@ |
#include "defs.h" |
#include "gdb_assert.h" |
-#include "gdb_string.h" |
+#include <string.h> |
#include "osabi.h" |
#include "arch-utils.h" |
@@ -63,7 +63,6 @@ static const char * const gdb_osabi_names[] = |
"Windows CE", |
"DJGPP", |
"Irix", |
- "Interix", |
"HP/UX ELF", |
"HP/UX SOM", |
"QNX Neutrino", |
@@ -73,6 +72,8 @@ static const char * const gdb_osabi_names[] = |
"Darwin", |
"Symbian", |
"OpenVMS", |
+ "LynxOS178", |
+ "Newlib", |
"<invalid>" |
}; |
@@ -370,14 +371,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 +434,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 +481,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 +494,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 +503,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; |