From af471f828cc74d65b50a7531ba2c69522266cfe9 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 31 Aug 2017 12:48:37 +0930 Subject: [PATCH] PR22048, Incorrect .eh_frame section in libc.so PR 21441 PR 22048 * elflink.c (bfd_elf_discard_info): Don't pad embedded zero terminators. --- bfd/ChangeLog | 7 +++++++ bfd/elflink.c | 25 +++++++++++++++---------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index c1d83f2..edc447e 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2017-08-31 Alan Modra + + PR 21441 + PR 22048 + * elflink.c (bfd_elf_discard_info): Don't pad embedded zero + terminators. + 2017-08-30 H.J. Lu * configure.ac (bfd_backends): Add elf64.lo together with 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), -- 2.7.4