diff options
author | Maciej W. Rozycki <macro@mips.com> | 2018-02-19 18:38:41 +0000 |
---|---|---|
committer | Maciej W. Rozycki <macro@mips.com> | 2018-02-19 18:38:41 +0000 |
commit | 6798f8bfa617c72240036571cb12313fef353090 (patch) | |
tree | ae568e9cf41034c27a3d9ae13b0ad2017a25130e /bfd | |
parent | 8772de117d8366988bc60c9f9c571e262ef75932 (diff) | |
download | gdb-6798f8bfa617c72240036571cb12313fef353090.zip gdb-6798f8bfa617c72240036571cb12313fef353090.tar.gz gdb-6798f8bfa617c72240036571cb12313fef353090.tar.bz2 |
MIPS/BFD: Fix the size of `.reginfo' and `.MIPS.abiflags' sections
Use the SEC_FIXED_SIZE flag to actually fix the size of `.reginfo' and
`.MIPS.abiflags' sections in `_bfd_mips_elf_always_size_sections', as
originally intended, removing link failures such as:
ld: final link failed: Section has no contents
or:
ld: final link failed: Bad value
or:
ld: foo: .reginfo section size should be 24 bytes, actual size is 32
and assertion failures like:
ld: BFD (GNU Binutils) 2.30.51.20180131 assertion fail .../bfd/elfxx-mips.c:14322
in link scenarios involving a linker script that either creates an
output `.reginfo' or `.MIPS.abiflags' section from scratch or produces
either section from different sections. If such an output section's
size turns out to be incorrect according to the psABI, then the section
is either truncated or padded out to the correct size, as relevant.
This allows people to handle these sections in a link in an unusual way,
while still addressing the issue covered by commit 58807c48a5a3
("_bfd_mips_elf_final_link: Notify user about wrong .reginfo size").
The original arrangement, coming from an unindentified change made to
what was called `mips_elf_always_size_sections' back then, between
commit 02650bd0a97e ("This adds ABI flags to MIPS/ELF object files.")
and commit 252b5132c753 ("19990502 sourceware import"), also missing
from BFD ChangeLog files, assumed that the output section size is not
going to change after return from `bfd_elf_size_dynamic_sections', the
caller of that function, called in turn from `ldemul_before_allocation'
via `gld${EMULATION_NAME}_before_allocation' in ld/emultempl/elf32.em,
and ultimately from `lang_process'. This is because later on in
`lang_process' processing `lang_size_sections' is called , happily
recalculating the section size, and it has actually already been the
case at the time of commit 252b5132c753 ("19990502 sourceware import"),
so the assumption was clearly incorrect right from the beginning.
bfd/
* elfxx-mips.c (_bfd_mips_elf_always_size_sections): Set
SEC_FIXED_SIZE and SEC_HAS_CONTENTS flags for `.reginfo' and
`.MIPS.abiflags' sections.
(_bfd_mips_elf_final_link): Avoid reading beyond `.reginfo'
section's end.
ld/
* testsuite/ld-mips-elf/reginfo-0.d: New test.
* testsuite/ld-mips-elf/reginfo-0r.d: New test.
* testsuite/ld-mips-elf/reginfo-1.d: New test.
* testsuite/ld-mips-elf/reginfo-1r.d: New test.
* testsuite/ld-mips-elf/reginfo-2.d: New test.
* testsuite/ld-mips-elf/reginfo-2r.d: New test.
* testsuite/ld-mips-elf/mips-abiflags-0.d: New test.
* testsuite/ld-mips-elf/mips-abiflags-0r.d: New test.
* testsuite/ld-mips-elf/mips-abiflags-1.d: New test.
* testsuite/ld-mips-elf/mips-abiflags-1r.d: New test.
* testsuite/ld-mips-elf/mips-abiflags-2.d: New test.
* testsuite/ld-mips-elf/mips-abiflags-2r.d: New test.
* testsuite/ld-mips-elf/reginfo-0.ld: New test linker script.
* testsuite/ld-mips-elf/reginfo-1.ld: New test linker script.
* testsuite/ld-mips-elf/mips-abiflags-0.ld: New test linker
script.
* testsuite/ld-mips-elf/mips-abiflags-1.ld: New test linker
script.
* testsuite/ld-mips-elf/reginfo-1.s: New test source.
* testsuite/ld-mips-elf/reginfo-2.s: New test source.
* testsuite/ld-mips-elf/mips-elf.exp: Run the new tests.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 8 | ||||
-rw-r--r-- | bfd/elfxx-mips.c | 17 |
2 files changed, 22 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b84a3d1..6820732 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,13 @@ 2018-02-19 Maciej W. Rozycki <macro@mips.com> + * elfxx-mips.c (_bfd_mips_elf_always_size_sections): Set + SEC_FIXED_SIZE and SEC_HAS_CONTENTS flags for `.reginfo' and + `.MIPS.abiflags' sections. + (_bfd_mips_elf_final_link): Avoid reading beyond `.reginfo' + section's end. + +2018-02-19 Maciej W. Rozycki <macro@mips.com> + * section.c (SEC_FIXED_SIZE): New macro. * bfd-in2.h: Regenerate. diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index 211f6f9..1b24f66 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -9294,12 +9294,19 @@ _bfd_mips_elf_always_size_sections (bfd *output_bfd, /* The .reginfo section has a fixed size. */ sect = bfd_get_section_by_name (output_bfd, ".reginfo"); if (sect != NULL) - bfd_set_section_size (output_bfd, sect, sizeof (Elf32_External_RegInfo)); + { + bfd_set_section_size (output_bfd, sect, sizeof (Elf32_External_RegInfo)); + sect->flags |= SEC_FIXED_SIZE | SEC_HAS_CONTENTS; + } /* The .MIPS.abiflags section has a fixed size. */ sect = bfd_get_section_by_name (output_bfd, ".MIPS.abiflags"); if (sect != NULL) - bfd_set_section_size (output_bfd, sect, sizeof (Elf_External_ABIFlags_v0)); + { + bfd_set_section_size (output_bfd, sect, + sizeof (Elf_External_ABIFlags_v0)); + sect->flags |= SEC_FIXED_SIZE | SEC_HAS_CONTENTS; + } hti.info = info; hti.output_bfd = output_bfd; @@ -14368,6 +14375,7 @@ _bfd_mips_elf_final_link (bfd *abfd, struct bfd_link_info *info) bfd *input_bfd; Elf32_External_RegInfo ext; Elf32_RegInfo sub; + bfd_size_type sz; if (p->type != bfd_indirect_link_order) { @@ -14379,8 +14387,11 @@ _bfd_mips_elf_final_link (bfd *abfd, struct bfd_link_info *info) input_section = p->u.indirect.section; input_bfd = input_section->owner; + sz = (input_section->size < sizeof (ext) + ? input_section->size : sizeof (ext)); + memset (&ext, 0, sizeof (ext)); if (! bfd_get_section_contents (input_bfd, input_section, - &ext, 0, sizeof ext)) + &ext, 0, sz)) return FALSE; bfd_mips_elf32_swap_reginfo_in (input_bfd, &ext, &sub); |