elf/x86: Issue an error on discarded output .plt section
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 18 Nov 2021 15:54:34 +0000 (07:54 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 18 Nov 2021 15:58:52 +0000 (07:58 -0800)
Issue an error, instead of crash, on discarded output .plt section.

bfd/

PR ld/28597
* elf32-i386.c (elf_i386_finish_dynamic_sections): Issue an error
on discarded output .plt section.
* elf64-x86-64.c (elf_x86_64_finish_dynamic_sections): Likewise.

ld/

PR ld/28597
* testsuite/ld-elf/pr28597.d: New file.
* testsuite/ld-elf/pr28597.s: Likewise.
* testsuite/ld-elf/pr28597.t: Likewise.

bfd/elf32-i386.c
bfd/elf64-x86-64.c
ld/testsuite/ld-elf/pr28597.d [new file with mode: 0644]
ld/testsuite/ld-elf/pr28597.s [new file with mode: 0644]
ld/testsuite/ld-elf/pr28597.t [new file with mode: 0644]

index 9a9e48becdbdaa2a6d282a1031da32adf4bf8844..0d7f29097e4bd271c8ab16dad4c66e5fe62051e1 100644 (file)
@@ -4017,6 +4017,14 @@ elf_i386_finish_dynamic_sections (bfd *output_bfd,
 
   if (htab->elf.splt && htab->elf.splt->size > 0)
     {
+      if (bfd_is_abs_section (htab->elf.splt->output_section))
+       {
+         info->callbacks->einfo
+           (_("%F%P: discarded output section: `%pA'\n"),
+            htab->elf.splt);
+         return false;
+       }
+
       /* UnixWare sets the entsize of .plt to 4, although that doesn't
         really seem like the right value.  */
       elf_section_data (htab->elf.splt->output_section)
index dc416a7f7120070f384de0e92a7dd4cff0455ad2..25e2bb156e8105e234e199238ab38eb540255638 100644 (file)
@@ -4677,6 +4677,14 @@ elf_x86_64_finish_dynamic_sections (bfd *output_bfd,
 
   if (htab->elf.splt && htab->elf.splt->size > 0)
     {
+      if (bfd_is_abs_section (htab->elf.splt->output_section))
+       {
+         info->callbacks->einfo
+           (_("%F%P: discarded output section: `%pA'\n"),
+            htab->elf.splt);
+         return false;
+       }
+
       elf_section_data (htab->elf.splt->output_section)
        ->this_hdr.sh_entsize = htab->plt.plt_entry_size;
 
diff --git a/ld/testsuite/ld-elf/pr28597.d b/ld/testsuite/ld-elf/pr28597.d
new file mode 100644 (file)
index 0000000..886182c
--- /dev/null
@@ -0,0 +1,3 @@
+#ld: -shared -T pr28597.t
+#error: .*: discarded output section: `.plt'
+#target: i?86-*-* x86_64-*-*
diff --git a/ld/testsuite/ld-elf/pr28597.s b/ld/testsuite/ld-elf/pr28597.s
new file mode 100644 (file)
index 0000000..620a635
--- /dev/null
@@ -0,0 +1,4 @@
+       .text
+       .globl  foo
+foo:
+       jmp     bar@PLT
diff --git a/ld/testsuite/ld-elf/pr28597.t b/ld/testsuite/ld-elf/pr28597.t
new file mode 100644 (file)
index 0000000..1f47a45
--- /dev/null
@@ -0,0 +1,14 @@
+SECTIONS
+{
+  .text           :
+  {
+    *(.text .text.*)
+  }
+  /DISCARD/ : { *(.dynsym) }
+  /DISCARD/ : { *(.dynstr*) }
+  /DISCARD/ : { *(.dynamic*) }
+  /DISCARD/ : { *(.plt*) }
+  /DISCARD/ : { *(.interp*) }
+  /DISCARD/ : { *(.gnu*) }
+  /DISCARD/ : { *(.note.gnu.property) }
+}