Use function view when iterating over block symbols
[binutils-gdb.git] / bfd / binary.c
index 999de0d8c41a4e7d8e5072de86983c1717ab900d..999d41c0611403c4ee34732fdce2d5e384f58f59 100644 (file)
@@ -1,5 +1,5 @@
 /* BFD back-end for binary objects.
 /* BFD back-end for binary objects.
-   Copyright (C) 1994-2020 Free Software Foundation, Inc.
+   Copyright (C) 1994-2022 Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support, <ian@cygnus.com>
 
    This file is part of BFD, the Binary File Descriptor library.
    Written by Ian Lance Taylor, Cygnus Support, <ian@cygnus.com>
 
    This file is part of BFD, the Binary File Descriptor library.
    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
    MA 02110-1301, USA.  */
 
    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
    MA 02110-1301, USA.  */
 
-/* This is a BFD backend which may be used to write binary objects.
-   It may only be used for output, not input.  The intention is that
-   this may be used as an output format for objcopy in order to
-   generate raw binary data.
+/* This is a BFD backend which may be used to read or write binary
+   objects.  Historically, it was used as an output format for objcopy
+   in order to generate raw binary data, but is now used for other
+   purposes as well.
 
    This is very simple.  The only complication is that the real data
    will start at some address X, and in some cases we will not want to
 
    This is very simple.  The only complication is that the real data
    will start at some address X, and in some cases we will not want to
 
 /* Create a binary object.  Invoked via bfd_set_format.  */
 
 
 /* Create a binary object.  Invoked via bfd_set_format.  */
 
-static bfd_boolean
+static bool
 binary_mkobject (bfd *abfd ATTRIBUTE_UNUSED)
 {
 binary_mkobject (bfd *abfd ATTRIBUTE_UNUSED)
 {
-  return TRUE;
+  return true;
 }
 
 /* Any file may be considered to be a binary file, provided the target
 }
 
 /* Any file may be considered to be a binary file, provided the target
@@ -95,17 +95,17 @@ binary_object_p (bfd *abfd)
 
 /* Get contents of the only section.  */
 
 
 /* Get contents of the only section.  */
 
-static bfd_boolean
+static bool
 binary_get_section_contents (bfd *abfd,
 binary_get_section_contents (bfd *abfd,
-                            asection *section ATTRIBUTE_UNUSED,
+                            asection *section,
                             void * location,
                             file_ptr offset,
                             bfd_size_type count)
 {
                             void * location,
                             file_ptr offset,
                             bfd_size_type count)
 {
-  if (bfd_seek (abfd, offset, SEEK_SET) != 0
+  if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0
       || bfd_bread (location, count, abfd) != count)
       || bfd_bread (location, count, abfd) != count)
-    return FALSE;
-  return TRUE;
+    return false;
+  return true;
 }
 
 /* Return the amount of memory needed to read the symbol table.  */
 }
 
 /* Return the amount of memory needed to read the symbol table.  */
@@ -218,7 +218,7 @@ binary_get_symbol_info (bfd *ignore_abfd ATTRIBUTE_UNUSED,
 
 /* Write section contents of a binary file.  */
 
 
 /* Write section contents of a binary file.  */
 
-static bfd_boolean
+static bool
 binary_set_section_contents (bfd *abfd,
                             asection *sec,
                             const void * data,
 binary_set_section_contents (bfd *abfd,
                             asection *sec,
                             const void * data,
@@ -226,18 +226,18 @@ binary_set_section_contents (bfd *abfd,
                             bfd_size_type size)
 {
   if (size == 0)
                             bfd_size_type size)
 {
   if (size == 0)
-    return TRUE;
+    return true;
 
   if (! abfd->output_has_begun)
     {
 
   if (! abfd->output_has_begun)
     {
-      bfd_boolean found_low;
+      bool found_low;
       bfd_vma low;
       asection *s;
 
       /* The lowest section LMA sets the virtual address of the start
         of the file.  We use this to set the file position of all the
         sections.  */
       bfd_vma low;
       asection *s;
 
       /* The lowest section LMA sets the virtual address of the start
         of the file.  We use this to set the file position of all the
         sections.  */
-      found_low = FALSE;
+      found_low = false;
       low = 0;
       for (s = abfd->sections; s != NULL; s = s->next)
        if (((s->flags
       low = 0;
       for (s = abfd->sections; s != NULL; s = s->next)
        if (((s->flags
@@ -247,7 +247,7 @@ binary_set_section_contents (bfd *abfd,
            && (! found_low || s->lma < low))
          {
            low = s->lma;
            && (! found_low || s->lma < low))
          {
            low = s->lma;
-           found_low = TRUE;
+           found_low = true;
          }
 
       for (s = abfd->sections; s != NULL; s = s->next)
          }
 
       for (s = abfd->sections; s != NULL; s = s->next)
@@ -278,16 +278,16 @@ binary_set_section_contents (bfd *abfd,
               s);
        }
 
               s);
        }
 
-      abfd->output_has_begun = TRUE;
+      abfd->output_has_begun = true;
     }
 
   /* We don't want to output anything for a section that is neither
      loaded nor allocated.  The contents of such a section are not
      meaningful in the binary format.  */
   if ((sec->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
     }
 
   /* We don't want to output anything for a section that is neither
      loaded nor allocated.  The contents of such a section are not
      meaningful in the binary format.  */
   if ((sec->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
-    return TRUE;
+    return true;
   if ((sec->flags & SEC_NEVER_LOAD) != 0)
   if ((sec->flags & SEC_NEVER_LOAD) != 0)
-    return TRUE;
+    return true;
 
   return _bfd_generic_set_section_contents (abfd, sec, data, offset, size);
 }
 
   return _bfd_generic_set_section_contents (abfd, sec, data, offset, size);
 }
@@ -335,6 +335,7 @@ const bfd_target binary_vec =
   ' ',                         /* ar_pad_char */
   16,                          /* ar_max_namelen */
   255,                         /* match priority.  */
   ' ',                         /* ar_pad_char */
   16,                          /* ar_max_namelen */
   255,                         /* match priority.  */
+  TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
   bfd_getb16, bfd_getb_signed_16, bfd_putb16,  /* data */
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
   bfd_getb16, bfd_getb_signed_16, bfd_putb16,  /* data */