PR26907, segment contains empty SHT_NOBITS section
authorAlan Modra <amodra@gmail.com>
Fri, 27 Nov 2020 22:15:02 +0000 (08:45 +1030)
committerAlan Modra <amodra@gmail.com>
Sat, 28 Nov 2020 08:01:32 +0000 (18:31 +1030)
Section ordering is important for _bfd_elf_map_sections_to_segments
and assign_file_positions_for_load_sections, which are only prepared
to handle sections in increasing LMA order.  When zero size sections
are involved it is possible to have multiple sections at the same LMA.
In that case the zero size sections must sort before any non-zero size
sections regardless of their types.

bfd/
PR 26907
* elf.c (elf_sort_sections): Don't sort zero size !load sections
after load sections.
ld/
* testsuite/ld-elf/pr26907.ld,
* testsuite/ld-elf/pr26907.s,
* testsuite/ld-elf/pr26907.d: New test.

bfd/ChangeLog
bfd/elf.c
ld/ChangeLog
ld/testsuite/ld-elf/pr26907.d [new file with mode: 0644]
ld/testsuite/ld-elf/pr26907.ld [new file with mode: 0644]
ld/testsuite/ld-elf/pr26907.s [new file with mode: 0644]

index 1e5e92374de0a1ca0330af17ee4e8d58048ec570..83eb64543b025d25438a9fbc69690ca997b26830 100644 (file)
@@ -1,3 +1,9 @@
+2020-11-28  Alan Modra  <amodra@gmail.com>
+
+       PR 26907
+       * elf.c (elf_sort_sections): Don't sort zero size !load sections
+       after load sections.
+
 2020-11-27  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
 
        * elf.c (special_sections_g): Add .gnu.linkonce.n and .gnu.linkonce.p.
index 28621da9158ce02e1e9ee8409c014408060a4ebb..419c5f4420cc8f6d539523f354fda9397510d379 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -5257,7 +5257,8 @@ elf_sort_sections (const void *arg1, const void *arg2)
 
   /* Put !SEC_LOAD sections after SEC_LOAD ones.  */
 
-#define TOEND(x) (((x)->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) == 0)
+#define TOEND(x) (((x)->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) == 0 \
+                 && (x)->size != 0)
 
   if (TOEND (sec1))
     {
index fbc2d8a63183bce94a0db4c7d6d4e0d45b30164a..b6d1aefdaf3b28421d25a51dbc2cb6b559bb72ac 100644 (file)
@@ -1,3 +1,9 @@
+2020-11-28  Alan Modra  <amodra@gmail.com>
+
+       * testsuite/ld-elf/pr26907.ld,
+       * testsuite/ld-elf/pr26907.s,
+       * testsuite/ld-elf/pr26907.d: New test.
+
 2020-11-27  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
 
        * emulparams/armelf.sh (OTHER_SECTIONS): Remove .noinit section
diff --git a/ld/testsuite/ld-elf/pr26907.d b/ld/testsuite/ld-elf/pr26907.d
new file mode 100644 (file)
index 0000000..1efb8cc
--- /dev/null
@@ -0,0 +1,9 @@
+#ld: -T pr26907.ld
+#readelf: -lW
+#xfail: dlx-*-* ft32-*-* h8300-*-* ip2k-*-* m32r*-*-elf* m32r*-*-rtems*
+#xfail: moxie-*-* msp430-*-* mt-*-* pru*-*-* visium-*-*
+
+#failif
+#...
+ +LOAD +0x[0-9a-f]+ 0x[0-9a-f]+ 0x[0-9a-f]+ 0x0+ 0x0+ .*
+#...
diff --git a/ld/testsuite/ld-elf/pr26907.ld b/ld/testsuite/ld-elf/pr26907.ld
new file mode 100644 (file)
index 0000000..2cce1ee
--- /dev/null
@@ -0,0 +1,7 @@
+ENTRY (_start)
+SECTIONS
+{
+  .text : { *(.text) }
+  .bss : { . = .; *(.bss) }
+  .data : { *(.data) }
+}
diff --git a/ld/testsuite/ld-elf/pr26907.s b/ld/testsuite/ld-elf/pr26907.s
new file mode 100644 (file)
index 0000000..13b3a54
--- /dev/null
@@ -0,0 +1,9 @@
+ .text
+ .global _start
+_start:
+ .quad 0
+
+ .data
+ .quad 0
+
+ .section .bss,"aw",%nobits