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>
Thu, 31 Aug 2017 03:48:16 +0000 (13:18 +0930)
PR 21441
PR 22048
* elflink.c (bfd_elf_discard_info): Don't pad embedded zero
terminators.

bfd/ChangeLog
bfd/elflink.c

index c1d83f20573278cb07b4b97549f064dce047ca5d..edc447e781a4f8347de93117901dcaa4c340636e 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-30  H.J. Lu  <hongjiu.lu@intel.com>
 
        * configure.ac (bfd_backends): Add elf64.lo together with
index ceacb37e4c804796ca6222d1a3e5a824911fff36..f6f57fa4154030951051ca32e1c292ee50f3ce22 100644 (file)
@@ -13878,17 +13878,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),