From f616c36b79d0776e51213b177e45a0f5d386cc58 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Sun, 24 Feb 2019 16:44:48 +1030 Subject: [PATCH] PR24144, pdp11-ld overwriting section data with zeros bfd/ PR 24144 * pdp11.c (set_section_contents): Revert 2015-02-24 change. gas/ PR 24144 * config/obj-aout.c (obj_aout_frob_file_before_fix): Write to end of section to ensure file contents cover aligned section size. --- bfd/ChangeLog | 5 +++++ bfd/pdp11.c | 8 -------- gas/ChangeLog | 6 ++++++ gas/config/obj-aout.c | 32 +++++++++++++++++++++----------- 4 files changed, 32 insertions(+), 19 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index ce088c96cda..e206629bd76 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2019-02-24 Alan Modra + + PR 24144 + * pdp11.c (set_section_contents): Revert 2015-02-24 change. + 2019-02-20 Eric Tsai * elf32-xtensa.c (is_resolvable_asm_expansion): Scan output diff --git a/bfd/pdp11.c b/bfd/pdp11.c index a46775a4edd..b16c78f9399 100644 --- a/bfd/pdp11.c +++ b/bfd/pdp11.c @@ -1146,14 +1146,6 @@ NAME (aout, set_section_contents) (bfd *abfd, if (bfd_seek (abfd, section->filepos + offset, SEEK_SET) != 0 || bfd_bwrite (location, count, abfd) != count) return FALSE; - - /* If necessary, pad the section to its aligned size. */ - if ((section == obj_datasec (abfd) - || section == obj_textsec (abfd)) - && count < section->size - && (bfd_seek (abfd, section->filepos + offset + section->size - 1, SEEK_SET) != 0 - || bfd_bwrite ("", 1, abfd) != 1)) - return FALSE; } return TRUE; diff --git a/gas/ChangeLog b/gas/ChangeLog index a301c047f1c..03c9b4e9aec 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2019-02-24 Alan Modra + + PR 24144 + * config/obj-aout.c (obj_aout_frob_file_before_fix): Write to end + of section to ensure file contents cover aligned section size. + 2019-02-22 Kyrylo Tkachov * config/tc-arm.c (arm_cpus): Add neoverse-n1. diff --git a/gas/config/obj-aout.c b/gas/config/obj-aout.c index 22e103b1e3d..03e0ef3c0a4 100644 --- a/gas/config/obj-aout.c +++ b/gas/config/obj-aout.c @@ -118,17 +118,27 @@ obj_aout_frob_file_before_fix (void) { /* Relocation processing may require knowing the VMAs of the sections. Since writing to a section will cause the BFD back end to compute the - VMAs, fake it out here.... */ - bfd_byte b = 0; - bfd_boolean x = TRUE; - if (bfd_section_size (stdoutput, text_section) != 0) - x = bfd_set_section_contents (stdoutput, text_section, &b, (file_ptr) 0, - (bfd_size_type) 1); - else if (bfd_section_size (stdoutput, data_section) != 0) - x = bfd_set_section_contents (stdoutput, data_section, &b, (file_ptr) 0, - (bfd_size_type) 1); - - gas_assert (x); + VMAs, fake it out here.... + Writing to the end of the section ensures the file contents + extend to cover the entire aligned size. We possibly won't know + the aligned size until after VMAs and sizes are set on the first + bfd_set_section_contents call, so it might be necessary to repeat. */ + asection *sec = NULL; + if (data_section->size != 0) + sec = data_section; + else if (text_section->size != 0) + sec = text_section; + if (sec) + { + bfd_size_type size; + do + { + bfd_byte b = 0; + size = sec->size; + gas_assert (bfd_set_section_contents (stdoutput, sec, &b, + size - 1, (bfd_size_type) 1)); + } while (size != sec->size); + } } static void -- 2.30.2