Add file size to ELF symbol labelling start of a binary file.
[deliverable/binutils-gdb.git] / gdb / osabi.c
index faffe30b448f7eda9b47f7b2b5f13a72a7883f1a..d33ef9ca08446f40b79d6bbac49c84615fba207e 100644 (file)
@@ -1,6 +1,6 @@
 /* OS ABI variant handling for GDB.
 
-   Copyright (C) 2001-2004, 2007-2012 Free Software Foundation, Inc.
+   Copyright (C) 2001-2014 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -19,9 +19,6 @@
 
 #include "defs.h"
 
-#include "gdb_assert.h"
-#include "gdb_string.h"
-
 #include "osabi.h"
 #include "arch-utils.h"
 #include "gdbcmd.h"
@@ -53,7 +50,6 @@ static const char * const gdb_osabi_names[] =
   "SVR4",
   "GNU/Hurd",
   "Solaris",
-  "OSF/1",
   "GNU/Linux",
   "FreeBSD a.out",
   "FreeBSD ELF",
@@ -63,7 +59,6 @@ static const char * const gdb_osabi_names[] =
   "Windows CE",
   "DJGPP",
   "Irix",
-  "Interix",
   "HP/UX ELF",
   "HP/UX SOM",
   "QNX Neutrino",
@@ -73,6 +68,8 @@ static const char * const gdb_osabi_names[] =
   "Darwin",
   "Symbian",
   "OpenVMS",
+  "LynxOS178",
+  "Newlib",
 
   "<invalid>"
 };
@@ -370,14 +367,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 +430,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 +477,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 +490,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 +499,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;
This page took 0.029152 seconds and 4 git commands to generate.