]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
PR22048, Incorrect .eh_frame section in libc.so
authorAlan Modra <amodra@gmail.com>
Thu, 31 Aug 2017 03:18:37 +0000 (12:48 +0930)
committerAlan Modra <amodra@gmail.com>
Tue, 19 Sep 2017 05:09:48 +0000 (14:39 +0930)
PR 21441
PR 22048
* elflink.c (bfd_elf_discard_info): Don't pad embedded zero
terminators.

(cherry picked from commit af471f828cc74d65b50a7531ba2c69522266cfe9)

bfd/ChangeLog
bfd/elflink.c

index 73377b9173395b37079349abae4becf771b7d596..268f187f56b24c9c6bc26192fc20a3dee9740bd9 100644 (file)
@@ -1,3 +1,10 @@
+2017-08-31  Alan Modra  <amodra@gmail.com>
+
+       PR 21441
+       PR 22048
+       * elflink.c (bfd_elf_discard_info): Don't pad embedded zero
+       terminators.
+
 2017-08-14  Alan Modra  <amodra@gmail.com>
 
        PR 21441
index 6bab097b0574131f8e7d76cf927a4b976f228188..d02aff974137e651e9f6552da0f5e9224a7cc62f 100644 (file)
@@ -13873,17 +13873,22 @@ bfd_elf_discard_info (bfd *output_bfd, struct bfd_link_info *info)
          /* Any prior sections must pad the last FDE out to the
             output section alignment.  Otherwise we might have zero
             padding between sections, which would be seen as a
-            terminator.  */
+            terminator.  If there is a terminator in the middle of
+            FDEs, don't increase its size as that will write bogus
+            data of whatever was after the terminator in the input
+            file, to the output file.  */
          for (; i != NULL; i = i->map_tail.s)
-           {
-             bfd_size_type size = (i->size + eh_alignment - 1) & -eh_alignment;
-             if (i->size != size)
-               {
-                 i->size = size;
-                 changed = 1;
-                 eh_changed = 1;
-               }
-           }
+           if (i->size != 4)
+             {
+               bfd_size_type size
+                 = (i->size + eh_alignment - 1) & -eh_alignment;
+               if (i->size != size)
+                 {
+                   i->size = size;
+                   changed = 1;
+                   eh_changed = 1;
+                 }
+             }
        }
       if (eh_changed)
        elf_link_hash_traverse (elf_hash_table (info),