aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog8
-rw-r--r--bfd/elfxx-mips.c17
-rw-r--r--ld/ChangeLog24
-rw-r--r--ld/testsuite/ld-mips-elf/mips-abiflags-0.d9
-rw-r--r--ld/testsuite/ld-mips-elf/mips-abiflags-0.ld5
-rw-r--r--ld/testsuite/ld-mips-elf/mips-abiflags-0r.d6
-rw-r--r--ld/testsuite/ld-mips-elf/mips-abiflags-1.d6
-rw-r--r--ld/testsuite/ld-mips-elf/mips-abiflags-1.ld5
-rw-r--r--ld/testsuite/ld-mips-elf/mips-abiflags-1r.d6
-rw-r--r--ld/testsuite/ld-mips-elf/mips-abiflags-2.d6
-rw-r--r--ld/testsuite/ld-mips-elf/mips-abiflags-2r.d6
-rw-r--r--ld/testsuite/ld-mips-elf/mips-elf.exp17
-rw-r--r--ld/testsuite/ld-mips-elf/reginfo-0.d9
-rw-r--r--ld/testsuite/ld-mips-elf/reginfo-0.ld5
-rw-r--r--ld/testsuite/ld-mips-elf/reginfo-0r.d9
-rw-r--r--ld/testsuite/ld-mips-elf/reginfo-1.d9
-rw-r--r--ld/testsuite/ld-mips-elf/reginfo-1.ld5
-rw-r--r--ld/testsuite/ld-mips-elf/reginfo-1.s10
-rw-r--r--ld/testsuite/ld-mips-elf/reginfo-1r.d9
-rw-r--r--ld/testsuite/ld-mips-elf/reginfo-2.d9
-rw-r--r--ld/testsuite/ld-mips-elf/reginfo-2.s10
-rw-r--r--ld/testsuite/ld-mips-elf/reginfo-2r.d9
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 ........ .*