| 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;
|
|
|