mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-11 19:33:33 +08:00
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 commit58807c48a5
("_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 commit02650bd0a9
("This adds ABI flags to MIPS/ELF object files.") and commit252b5132c7
("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 commit252b5132c7
("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.
This commit is contained in:
parent
8772de117d
commit
6798f8bfa6
@ -1,3 +1,11 @@
|
||||
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.
|
||||
|
@ -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);
|
||||
|
24
ld/ChangeLog
24
ld/ChangeLog
@ -1,3 +1,27 @@
|
||||
2018-02-19 Maciej W. Rozycki <macro@mips.com>
|
||||
|
||||
* 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.
|
||||
|
||||
2018-02-19 Maciej W. Rozycki <macro@mips.com>
|
||||
|
||||
* ldlang.c (insert_pad): Do not change output section's size if
|
||||
|
9
ld/testsuite/ld-mips-elf/mips-abiflags-0.d
Normal file
9
ld/testsuite/ld-mips-elf/mips-abiflags-0.d
Normal file
@ -0,0 +1,9 @@
|
||||
#readelf: -x .MIPS.abiflags
|
||||
#name: MIPS .MIPS.abiflags section size 0
|
||||
#source: empty.s RUN_OBJCOPY
|
||||
#objcopy_objects: -R .MIPS.abiflags
|
||||
#ld: -T mips-abiflags-0.ld
|
||||
|
||||
Hex dump of section '\.MIPS\.abiflags':
|
||||
0x00000000 ........ ........ ........ ........ .*
|
||||
0x00000010 ........ ........ .*
|
5
ld/testsuite/ld-mips-elf/mips-abiflags-0.ld
Normal file
5
ld/testsuite/ld-mips-elf/mips-abiflags-0.ld
Normal file
@ -0,0 +1,5 @@
|
||||
SECTIONS
|
||||
{
|
||||
.MIPS.abiflags : { foo = .; }
|
||||
/DISCARD/ : { *(*) }
|
||||
}
|
6
ld/testsuite/ld-mips-elf/mips-abiflags-0r.d
Normal file
6
ld/testsuite/ld-mips-elf/mips-abiflags-0r.d
Normal file
@ -0,0 +1,6 @@
|
||||
#readelf: -x .MIPS.abiflags
|
||||
#name: MIPS .MIPS.abiflags section size 0 (relocatable)
|
||||
#source: empty.s RUN_OBJCOPY
|
||||
#objcopy_objects: -R .MIPS.abiflags
|
||||
#ld: -r -T mips-abiflags-0.ld
|
||||
#dump: mips-abiflags-0.d
|
6
ld/testsuite/ld-mips-elf/mips-abiflags-1.d
Normal file
6
ld/testsuite/ld-mips-elf/mips-abiflags-1.d
Normal file
@ -0,0 +1,6 @@
|
||||
#readelf: -x .MIPS.abiflags
|
||||
#name: MIPS .MIPS.abiflags section size 1
|
||||
#source: reginfo-1.s RUN_OBJCOPY
|
||||
#objcopy_objects: -R .MIPS.abiflags
|
||||
#ld: -T mips-abiflags-1.ld
|
||||
#dump: mips-abiflags-0.d
|
5
ld/testsuite/ld-mips-elf/mips-abiflags-1.ld
Normal file
5
ld/testsuite/ld-mips-elf/mips-abiflags-1.ld
Normal file
@ -0,0 +1,5 @@
|
||||
SECTIONS
|
||||
{
|
||||
.MIPS.abiflags : { *(.foo) }
|
||||
/DISCARD/ : { *(*) }
|
||||
}
|
6
ld/testsuite/ld-mips-elf/mips-abiflags-1r.d
Normal file
6
ld/testsuite/ld-mips-elf/mips-abiflags-1r.d
Normal file
@ -0,0 +1,6 @@
|
||||
#readelf: -x .MIPS.abiflags
|
||||
#name: MIPS .MIPS.abiflags section size 1 (relocatable)
|
||||
#source: reginfo-1.s RUN_OBJCOPY
|
||||
#objcopy_objects: -R .MIPS.abiflags
|
||||
#ld: -r -T mips-abiflags-1.ld
|
||||
#dump: mips-abiflags-0.d
|
6
ld/testsuite/ld-mips-elf/mips-abiflags-2.d
Normal file
6
ld/testsuite/ld-mips-elf/mips-abiflags-2.d
Normal file
@ -0,0 +1,6 @@
|
||||
#readelf: -x .MIPS.abiflags
|
||||
#name: MIPS .MIPS.abiflags section size 2
|
||||
#source: reginfo-2.s RUN_OBJCOPY
|
||||
#objcopy_objects: -R .MIPS.abiflags
|
||||
#ld: -T mips-abiflags-1.ld
|
||||
#dump: mips-abiflags-0.d
|
6
ld/testsuite/ld-mips-elf/mips-abiflags-2r.d
Normal file
6
ld/testsuite/ld-mips-elf/mips-abiflags-2r.d
Normal file
@ -0,0 +1,6 @@
|
||||
#readelf: -x .MIPS.abiflags
|
||||
#name: MIPS .MIPS.abiflags section size 2 (relocatable)
|
||||
#source: reginfo-2.s RUN_OBJCOPY
|
||||
#objcopy_objects: -R .MIPS.abiflags
|
||||
#ld: -r -T mips-abiflags-1.ld
|
||||
#dump: mips-abiflags-0.d
|
@ -57,6 +57,7 @@ set has_newabi [expr [istarget *-*-irix6*] \
|
||||
|| [istarget mips*-sde-elf*] \
|
||||
|| [istarget mips*-mti-elf*] \
|
||||
|| [istarget mips*-img-elf*]]
|
||||
set has_elf32 [expr ![istarget *-*-openbsd*]]
|
||||
set linux_gnu [expr [istarget mips*-*-linux*]]
|
||||
set embedded_elf [expr [istarget mips*-*-elf]]
|
||||
|
||||
@ -1237,3 +1238,19 @@ rename mips_old_prune_warnings prune_warnings
|
||||
|
||||
# Verify that we can link ELF input into the `binary' output format.
|
||||
run_dump_test "binary"
|
||||
|
||||
# Verify special section processing.
|
||||
if $has_elf32 {
|
||||
run_dump_test "reginfo-0"
|
||||
run_dump_test "reginfo-0r"
|
||||
run_dump_test "reginfo-1"
|
||||
run_dump_test "reginfo-1r"
|
||||
run_dump_test "reginfo-2"
|
||||
run_dump_test "reginfo-2r"
|
||||
}
|
||||
run_dump_test "mips-abiflags-0"
|
||||
run_dump_test "mips-abiflags-0r"
|
||||
run_dump_test "mips-abiflags-1"
|
||||
run_dump_test "mips-abiflags-1r"
|
||||
run_dump_test "mips-abiflags-2"
|
||||
run_dump_test "mips-abiflags-2r"
|
||||
|
9
ld/testsuite/ld-mips-elf/reginfo-0.d
Normal file
9
ld/testsuite/ld-mips-elf/reginfo-0.d
Normal file
@ -0,0 +1,9 @@
|
||||
#readelf: -x .reginfo
|
||||
#name: MIPS .reginfo section size 0
|
||||
#source: empty.s RUN_OBJCOPY
|
||||
#objcopy_objects: -R .reginfo
|
||||
#ld: -T reginfo-0.ld
|
||||
|
||||
Hex dump of section '\.reginfo':
|
||||
0x00000000 00000000 00000000 00000000 00000000 .*
|
||||
0x00000010 00000000 00000000 .*
|
5
ld/testsuite/ld-mips-elf/reginfo-0.ld
Normal file
5
ld/testsuite/ld-mips-elf/reginfo-0.ld
Normal file
@ -0,0 +1,5 @@
|
||||
SECTIONS
|
||||
{
|
||||
.reginfo : { foo = .; }
|
||||
/DISCARD/ : { *(*) }
|
||||
}
|
9
ld/testsuite/ld-mips-elf/reginfo-0r.d
Normal file
9
ld/testsuite/ld-mips-elf/reginfo-0r.d
Normal file
@ -0,0 +1,9 @@
|
||||
#readelf: -x .reginfo
|
||||
#name: MIPS .reginfo section size 0 (relocatable)
|
||||
#source: empty.s RUN_OBJCOPY
|
||||
#objcopy_objects: -R .reginfo
|
||||
#ld: -r -T reginfo-0.ld
|
||||
|
||||
Hex dump of section '\.reginfo':
|
||||
0x00000000 00000000 00000000 00000000 00000000 .*
|
||||
0x00000010 00000000 ........ .*
|
9
ld/testsuite/ld-mips-elf/reginfo-1.d
Normal file
9
ld/testsuite/ld-mips-elf/reginfo-1.d
Normal file
@ -0,0 +1,9 @@
|
||||
#readelf: -x .reginfo
|
||||
#name: MIPS .reginfo section size 1
|
||||
#source: reginfo-1.s RUN_OBJCOPY
|
||||
#objcopy_objects: -R .reginfo
|
||||
#ld: -T reginfo-1.ld
|
||||
|
||||
Hex dump of section '\.reginfo':
|
||||
0x00000000 01020304 05060708 090a0b0c 0d0e0f10 .*
|
||||
0x00000010 00000000 00000000 .*
|
5
ld/testsuite/ld-mips-elf/reginfo-1.ld
Normal file
5
ld/testsuite/ld-mips-elf/reginfo-1.ld
Normal file
@ -0,0 +1,5 @@
|
||||
SECTIONS
|
||||
{
|
||||
.reginfo : { *(.foo) }
|
||||
/DISCARD/ : { *(*) }
|
||||
}
|
10
ld/testsuite/ld-mips-elf/reginfo-1.s
Normal file
10
ld/testsuite/ld-mips-elf/reginfo-1.s
Normal file
@ -0,0 +1,10 @@
|
||||
.section .foo, "aw", @progbits
|
||||
.globl foo
|
||||
.type foo, @object
|
||||
foo:
|
||||
.set .Li, 0
|
||||
.rept 16
|
||||
.set .Li, .Li + 1
|
||||
.byte .Li
|
||||
.endr
|
||||
.size foo, . - foo
|
9
ld/testsuite/ld-mips-elf/reginfo-1r.d
Normal file
9
ld/testsuite/ld-mips-elf/reginfo-1r.d
Normal file
@ -0,0 +1,9 @@
|
||||
#readelf: -x .reginfo
|
||||
#name: MIPS .reginfo section size 1 (relocatable)
|
||||
#source: reginfo-1.s RUN_OBJCOPY
|
||||
#objcopy_objects: -R .reginfo
|
||||
#ld: -r -T reginfo-1.ld
|
||||
|
||||
Hex dump of section '\.reginfo':
|
||||
0x00000000 01020304 05060708 090a0b0c 0d0e0f10 .*
|
||||
0x00000010 00000000 ........ .*
|
9
ld/testsuite/ld-mips-elf/reginfo-2.d
Normal file
9
ld/testsuite/ld-mips-elf/reginfo-2.d
Normal file
@ -0,0 +1,9 @@
|
||||
#readelf: -x .reginfo
|
||||
#name: MIPS .reginfo section size 2
|
||||
#source: reginfo-2.s RUN_OBJCOPY
|
||||
#objcopy_objects: -R .reginfo
|
||||
#ld: -T reginfo-1.ld
|
||||
|
||||
Hex dump of section '\.reginfo':
|
||||
0x00000000 01020304 05060708 090a0b0c 0d0e0f10 .*
|
||||
0x00000010 11121314 00000000 .*
|
10
ld/testsuite/ld-mips-elf/reginfo-2.s
Normal file
10
ld/testsuite/ld-mips-elf/reginfo-2.s
Normal file
@ -0,0 +1,10 @@
|
||||
.section .foo, "aw", @progbits
|
||||
.globl foo
|
||||
.type foo, @object
|
||||
foo:
|
||||
.set .Li, 0
|
||||
.rept 32
|
||||
.set .Li, .Li + 1
|
||||
.byte .Li
|
||||
.endr
|
||||
.size foo, . - foo
|
9
ld/testsuite/ld-mips-elf/reginfo-2r.d
Normal file
9
ld/testsuite/ld-mips-elf/reginfo-2r.d
Normal file
@ -0,0 +1,9 @@
|
||||
#readelf: -x .reginfo
|
||||
#name: MIPS .reginfo section size 2 (relocatable)
|
||||
#source: reginfo-2.s RUN_OBJCOPY
|
||||
#objcopy_objects: -R .reginfo
|
||||
#ld: -r -T reginfo-1.ld
|
||||
|
||||
Hex dump of section '\.reginfo':
|
||||
0x00000000 01020304 05060708 090a0b0c 0d0e0f10 .*
|
||||
0x00000010 11121314 ........ .*
|
Loading…
Reference in New Issue
Block a user