bfd/mmo.c: handle "objcopy --extract-symbols" generating and reading back.
authorHans-Peter Nilsson <hp@bitrange.com>
Thu, 22 Oct 2015 07:32:30 +0000 (09:32 +0200)
committerHans-Peter Nilsson <hp@bitrange.com>
Thu, 22 Oct 2015 14:17:32 +0000 (16:17 +0200)
bfd:
* mmo.c (struct mmo_data_struct): New members
symbol_consistency_override_calculated and ignore_symbol_consistency.
(mmo_section_has_contents, mmo_ignore_symbol_consistency): New
functions.
(mmo_create_symbol): Check with mmo_ignore_symbol_consistency if to
report an error for unexpected value of Main.
(mmo_write_symbols_and_terminator): Similar.

bfd/ChangeLog
bfd/mmo.c

index 961a3857f6ca14e9bbf8f403325fc4058786f097..e647a2b8ccd82105b9b7b513cc79a304fe8f44ad 100644 (file)
@@ -1,3 +1,13 @@
+2015-10-22  Hans-Peter Nilsson  <hp@bitrange.com>
+
+       * mmo.c (struct mmo_data_struct): New members
+       symbol_consistency_override_calculated and ignore_symbol_consistency.
+       (mmo_section_has_contents, mmo_ignore_symbol_consistency): New
+       functions.
+       (mmo_create_symbol): Check with mmo_ignore_symbol_consistency if to
+       report an error for unexpected value of Main.
+       (mmo_write_symbols_and_terminator): Similar.
+
 2015-10-22  H.J. Lu  <hongjiu.lu@intel.com>
 
        * elf32-i386.c (elf_i386_convert_load): Use call_nop_byte and
index 484a370fd9f00b1a521d21c3cfa5b12a0882536f..316afe8991845fb875742e5018fe8253416efa53 100644 (file)
--- a/bfd/mmo.c
+++ b/bfd/mmo.c
@@ -330,6 +330,14 @@ struct mmo_data_struct
 
     /* We also need a buffer to hold the bytes we count reading or writing.  */
     bfd_byte buf[4];
+
+    /* Whether we've calculated symbol consistency requirement yet.  We do this
+       when-needed, which must be at some time after all section
+       contents is known.  */
+    bfd_boolean symbol_consistency_override_calculated;
+
+    /* Whether to consistency-check symbol values, in particular "Main".  */
+    bfd_boolean ignore_symbol_consistency;
   };
 
 typedef struct mmo_data_struct tdata_type;
@@ -585,6 +593,34 @@ mmo_mkobject (bfd *abfd)
   return TRUE;
 }
 
+static bfd_boolean
+mmo_section_has_contents (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *p ATTRIBUTE_UNUSED)
+{
+  /* The point is to match what --extract-symbols does (well, negated).  */
+  return bfd_get_section_size (sec) != 0;
+}
+
+/* Find out whether we should omit symbol consistency checks for this
+   bfd and cache the value.
+
+   This function must only be called when all section contents is
+   known.  However, calculating symbol consistency at the time the
+   private BFD data is initialized is too late for some uses.  */
+
+static bfd_boolean
+mmo_ignore_symbol_consistency (bfd *abfd)
+{
+  if (!abfd->tdata.mmo_data->symbol_consistency_override_calculated)
+    {
+      abfd->tdata.mmo_data->ignore_symbol_consistency =
+       bfd_sections_find_if (abfd, mmo_section_has_contents, NULL) == NULL;
+
+      abfd->tdata.mmo_data->symbol_consistency_override_calculated = TRUE;
+    }
+
+  return abfd->tdata.mmo_data->ignore_symbol_consistency;
+}
+
 static bfd_boolean
 mmo_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
 {
@@ -1208,7 +1244,8 @@ mmo_create_symbol (bfd *abfd, const char *symname, bfd_vma addr, enum
      object.  For written objects, we do it while setting the symbol
      table.  */
   if (strcmp (symname, MMIX_START_SYMBOL_NAME) == 0
-      && bfd_get_start_address (abfd) != addr)
+      && bfd_get_start_address (abfd) != addr
+      && !mmo_ignore_symbol_consistency (abfd))
     {
       (*_bfd_error_handler)
        (_("%s: invalid mmo file: initialization value for $255 is not `Main'\n"),
@@ -2900,13 +2937,14 @@ mmo_write_symbols_and_terminator (bfd *abfd)
          = (mainsym->value
             + mainsym->section->output_section->vma
             + mainsym->section->output_offset);
-         memcpy (table + 1, orig_table, i * sizeof (asymbol *));
+       memcpy (table + 1, orig_table, i * sizeof (asymbol *));
        table[0] = mainsym;
 
        /* Check that the value assigned to :Main is the same as the entry
           address.  The default linker script asserts this.  This is as
           good a place as any to check this consistency. */
-       if (mainvalue != bfd_get_start_address (abfd))
+       if (mainvalue != bfd_get_start_address (abfd)
+           && !mmo_ignore_symbol_consistency (abfd))
          {
            /* Arbitrary buffer to hold the printable representation of a
               vma.  */
This page took 0.028039 seconds and 4 git commands to generate.