Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(834)

Unified Diff: gdb/osabi.c

Issue 124383005: GDB 7.6.50 (Closed) Base URL: http://git.chromium.org/native_client/nacl-gdb.git@upstream
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gdb/osabi.h ('k') | gdb/osdata.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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, &sectsize, "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, &sectsize, "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, &sectsize, "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, &sectsize, "OpenBSD", 4,
+ NT_OPENBSD_IDENT))
{
/* There is no need to check the version yet. */
*osabi = GDB_OSABI_OPENBSD_ELF;
« no previous file with comments | « gdb/osabi.h ('k') | gdb/osdata.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698