diff options
22 files changed, 196 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); diff --git a/ld/ChangeLog b/ld/ChangeLog index 4f5cd5f..f2cc005 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,5 +1,29 @@ 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 SEC_FIXED_SIZE is set in the flags. (size_input_section): Likewise. diff --git a/ld/testsuite/ld-mips-elf/mips-abiflags-0.d b/ld/testsuite/ld-mips-elf/mips-abiflags-0.d new file mode 100644 index 0000000..8d243f4 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/mips-abiflags-0.d @@ -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 ........ ........ .* diff --git a/ld/testsuite/ld-mips-elf/mips-abiflags-0.ld b/ld/testsuite/ld-mips-elf/mips-abiflags-0.ld new file mode 100644 index 0000000..419756e --- /dev/null +++ b/ld/testsuite/ld-mips-elf/mips-abiflags-0.ld @@ -0,0 +1,5 @@ +SECTIONS +{ + .MIPS.abiflags : { foo = .; } + /DISCARD/ : { *(*) } +} diff --git a/ld/testsuite/ld-mips-elf/mips-abiflags-0r.d b/ld/testsuite/ld-mips-elf/mips-abiflags-0r.d new file mode 100644 index 0000000..0118e07 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/mips-abiflags-0r.d @@ -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 diff --git a/ld/testsuite/ld-mips-elf/mips-abiflags-1.d b/ld/testsuite/ld-mips-elf/mips-abiflags-1.d new file mode 100644 index 0000000..d28b3da --- /dev/null +++ b/ld/testsuite/ld-mips-elf/mips-abiflags-1.d @@ -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 diff --git a/ld/testsuite/ld-mips-elf/mips-abiflags-1.ld b/ld/testsuite/ld-mips-elf/mips-abiflags-1.ld new file mode 100644 index 0000000..7287a1e --- /dev/null +++ b/ld/testsuite/ld-mips-elf/mips-abiflags-1.ld @@ -0,0 +1,5 @@ +SECTIONS +{ + .MIPS.abiflags : { *(.foo) } + /DISCARD/ : { *(*) } +} diff --git a/ld/testsuite/ld-mips-elf/mips-abiflags-1r.d b/ld/testsuite/ld-mips-elf/mips-abiflags-1r.d new file mode 100644 index 0000000..821a5b2 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/mips-abiflags-1r.d @@ -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 diff --git a/ld/testsuite/ld-mips-elf/mips-abiflags-2.d b/ld/testsuite/ld-mips-elf/mips-abiflags-2.d new file mode 100644 index 0000000..796a8c2 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/mips-abiflags-2.d @@ -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 diff --git a/ld/testsuite/ld-mips-elf/mips-abiflags-2r.d b/ld/testsuite/ld-mips-elf/mips-abiflags-2r.d new file mode 100644 index 0000000..596e0eb --- /dev/null +++ b/ld/testsuite/ld-mips-elf/mips-abiflags-2r.d @@ -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 diff --git a/ld/testsuite/ld-mips-elf/mips-elf.exp b/ld/testsuite/ld-mips-elf/mips-elf.exp index 13dbbc6..144b007 100644 --- a/ld/testsuite/ld-mips-elf/mips-elf.exp +++ b/ld/testsuite/ld-mips-elf/mips-elf.exp @@ -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" diff --git a/ld/testsuite/ld-mips-elf/reginfo-0.d b/ld/testsuite/ld-mips-elf/reginfo-0.d new file mode 100644 index 0000000..ee731eb --- /dev/null +++ b/ld/testsuite/ld-mips-elf/reginfo-0.d @@ -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 .* diff --git a/ld/testsuite/ld-mips-elf/reginfo-0.ld b/ld/testsuite/ld-mips-elf/reginfo-0.ld new file mode 100644 index 0000000..d37eb0a --- /dev/null +++ b/ld/testsuite/ld-mips-elf/reginfo-0.ld @@ -0,0 +1,5 @@ +SECTIONS +{ + .reginfo : { foo = .; } + /DISCARD/ : { *(*) } +} diff --git a/ld/testsuite/ld-mips-elf/reginfo-0r.d b/ld/testsuite/ld-mips-elf/reginfo-0r.d new file mode 100644 index 0000000..f37ff80 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/reginfo-0r.d @@ -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 ........ .* diff --git a/ld/testsuite/ld-mips-elf/reginfo-1.d b/ld/testsuite/ld-mips-elf/reginfo-1.d new file mode 100644 index 0000000..dc98549 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/reginfo-1.d @@ -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 .* diff --git a/ld/testsuite/ld-mips-elf/reginfo-1.ld b/ld/testsuite/ld-mips-elf/reginfo-1.ld new file mode 100644 index 0000000..151d19a --- /dev/null +++ b/ld/testsuite/ld-mips-elf/reginfo-1.ld @@ -0,0 +1,5 @@ +SECTIONS +{ + .reginfo : { *(.foo) } + /DISCARD/ : { *(*) } +} diff --git a/ld/testsuite/ld-mips-elf/reginfo-1.s b/ld/testsuite/ld-mips-elf/reginfo-1.s new file mode 100644 index 0000000..2aad272 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/reginfo-1.s @@ -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 diff --git a/ld/testsuite/ld-mips-elf/reginfo-1r.d b/ld/testsuite/ld-mips-elf/reginfo-1r.d new file mode 100644 index 0000000..ca262fd --- /dev/null +++ b/ld/testsuite/ld-mips-elf/reginfo-1r.d @@ -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 ........ .* diff --git a/ld/testsuite/ld-mips-elf/reginfo-2.d b/ld/testsuite/ld-mips-elf/reginfo-2.d new file mode 100644 index 0000000..11b7360 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/reginfo-2.d @@ -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 .* diff --git a/ld/testsuite/ld-mips-elf/reginfo-2.s b/ld/testsuite/ld-mips-elf/reginfo-2.s new file mode 100644 index 0000000..fdc6e6a --- /dev/null +++ b/ld/testsuite/ld-mips-elf/reginfo-2.s @@ -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 diff --git a/ld/testsuite/ld-mips-elf/reginfo-2r.d b/ld/testsuite/ld-mips-elf/reginfo-2r.d new file mode 100644 index 0000000..f133337 --- /dev/null +++ b/ld/testsuite/ld-mips-elf/reginfo-2r.d @@ -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 ........ .* |