This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
PR22048, Incorrect .eh_frame section in libc.so
- From: Alan Modra <amodra at gmail dot com>
- To: binutils at sourceware dot org
- Date: Thu, 31 Aug 2017 13:27:27 +0930
- Subject: PR22048, Incorrect .eh_frame section in libc.so
- Authentication-results: sourceware.org; auth=none
Yep, there is definitely an incorrect .eh_frame section in libc.so.
It has a ZERO terminator in the middle!
PR 21441
PR 22048
* elflink.c (bfd_elf_discard_info): Don't pad embedded zero
terminators.
diff --git a/bfd/elflink.c b/bfd/elflink.c
index ceacb37..f6f57fa 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -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),
--
Alan Modra
Australia Development Lab, IBM