Fix the generation of relocs for missing build notes.
authorNick Clifton <nickc@redhat.com>
Wed, 15 Jul 2020 11:52:53 +0000 (12:52 +0100)
committerNick Clifton <nickc@redhat.com>
Wed, 15 Jul 2020 11:52:53 +0000 (12:52 +0100)
* write.c (create_note_reloc): Add desc2_size parameter.  Zero out
the addend field of REL relocations.  Store the full addend into
the note for REL relocations.

gas/ChangeLog
gas/write.c

index 76e17516cac4560f5c3096a8f32ba66a6dda7c7c..194819eecfd4cfed73b37015cfb75f262545c1d0 100644 (file)
@@ -1,3 +1,9 @@
+2020-07-15  Nick Clifton  <nickc@redhat.com>
+
+       * write.c (create_note_reloc): Add desc2_size parameter.  Zero out
+       the addend field of REL relocations.  Store the full addend into
+       the note for REL relocations.
+
 2020-07-15  Jan Beulich  <jbeulich@suse.com>
 
        * testsuite/gas/i386/x86-64-stack.s: Adjust 32-bit push
index 9a50185b157b3a11998a1df2eda747f9d5f72fe8..0b43063bbaab76d21fe3bac5fb4643bfff3c72e2 100644 (file)
@@ -1897,6 +1897,7 @@ create_note_reloc (segT           sec,
                   symbolS *      sym,
                   bfd_size_type  note_offset,
                   bfd_size_type  desc2_offset,
+                  offsetT        desc2_size,
                   int            reloc_type,
                   bfd_vma        addend,
                   char *         note)
@@ -1931,15 +1932,21 @@ create_note_reloc (segT           sec,
         but still stores the addend in the word being relocated.  */
       || strstr (bfd_get_target (stdoutput), "-sh") != NULL)
     {
+      offsetT i;
+
+      /* Zero out the addend, since it is now stored in the note.  */
+      reloc->u.b.r.addend = 0;
+
       if (target_big_endian)
        {
-         if (bfd_arch_bits_per_address (stdoutput) <= 32)
-           note[desc2_offset + 3] = addend;
-         else
-           note[desc2_offset + 7] = addend;
+         for (i = desc2_size; addend != 0 && i > 0; addend >>= 8, i--)
+           note[desc2_offset + i - 1] = (addend & 0xff);
        }
       else
-       note[desc2_offset] = addend;
+       {
+         for (i = 0; addend != 0 && i < desc2_size; addend >>= 8, i++)
+           note[desc2_offset + i] = (addend & 0xff);
+       }
     }
 }
 
@@ -2025,14 +2032,14 @@ maybe_generate_build_notes (void)
        if (target_big_endian)
          {
            note[3] = 8; /* strlen (name) + 1.  */
-           note[7] = desc_size; /* Two 8-byte offsets.  */
+           note[7] = desc_size; /* Two N-byte offsets.  */
            note[10] = NT_GNU_BUILD_ATTRIBUTE_OPEN >> 8;
            note[11] = NT_GNU_BUILD_ATTRIBUTE_OPEN & 0xff;
          }
        else
          {
            note[0] = 8; /* strlen (name) + 1.  */
-           note[4] = desc_size; /* Two 8-byte offsets.  */
+           note[4] = desc_size; /* Two N-byte offsets.  */
            note[8] = NT_GNU_BUILD_ATTRIBUTE_OPEN & 0xff;
            note[9] = NT_GNU_BUILD_ATTRIBUTE_OPEN >> 8;
          }
@@ -2042,10 +2049,12 @@ maybe_generate_build_notes (void)
        memcpy (note + 12, "GA$\ 13a1", 8);
 
        /* Create a relocation to install the start address of the note...  */
-       create_note_reloc (sec, sym, total_size, 20, desc_reloc, 0, note);
+       create_note_reloc (sec, sym, total_size, 20, desc_size / 2, desc_reloc, 0, note);
 
        /* ...and another one to install the end address.  */
-       create_note_reloc (sec, sym, total_size, desc2_offset, desc_reloc,
+       create_note_reloc (sec, sym, total_size, desc2_offset,
+                          desc_size / 2,
+                          desc_reloc,
                           bfd_section_size (bsym->section),
                           note);