elf/x86: Issue an error on discarded output .plt section

Message ID 20211118155811.288499-1-hjl.tools@gmail.com
State New
Headers show
Series
  • elf/x86: Issue an error on discarded output .plt section
Related show

Commit Message

Mike Frysinger via Binutils Nov. 18, 2021, 3:58 p.m.
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              |  8 ++++++++
 bfd/elf64-x86-64.c            |  8 ++++++++
 ld/testsuite/ld-elf/pr28597.d |  3 +++
 ld/testsuite/ld-elf/pr28597.s |  4 ++++
 ld/testsuite/ld-elf/pr28597.t | 14 ++++++++++++++
 5 files changed, 37 insertions(+)
 create mode 100644 ld/testsuite/ld-elf/pr28597.d
 create mode 100644 ld/testsuite/ld-elf/pr28597.s
 create mode 100644 ld/testsuite/ld-elf/pr28597.t

-- 
2.33.1

Comments

Mike Frysinger via Binutils Nov. 22, 2021, 12:08 a.m. | #1
On Thu, Nov 18, 2021 at 07:58:11AM -0800, H.J. Lu via Binutils wrote:
> Issue an error, instead of crash, on discarded output .plt section.


Are you sure you want an error?  There may be uses of the linker where
discarding the .plt via a linker script is deliberate.  Obviously it
wouldn't be to create a runnable executable, but ld output is used in
weird ways.

-- 
Alan Modra
Australia Development Lab, IBM
Mike Frysinger via Binutils Nov. 22, 2021, 12:33 a.m. | #2
On Sun, Nov 21, 2021 at 4:09 PM Alan Modra <amodra@gmail.com> wrote:
>

> On Thu, Nov 18, 2021 at 07:58:11AM -0800, H.J. Lu via Binutils wrote:

> > Issue an error, instead of crash, on discarded output .plt section.

>

> Are you sure you want an error?  There may be uses of the linker where

> discarding the .plt via a linker script is deliberate.  Obviously it

> wouldn't be to create a runnable executable, but ld output is used in

> weird ways.

>


Yes, an error is appropriate here. If one doesn't want a .plt section,
she/he should discard sections which require a .plt section.

-- 
H.J.

Patch

diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
index 9a9e48becdb..0d7f29097e4 100644
--- a/bfd/elf32-i386.c
+++ b/bfd/elf32-i386.c
@@ -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)
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index dc416a7f712..25e2bb156e8 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -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
index 00000000000..886182c120d
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr28597.d
@@ -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
index 00000000000..620a6351cae
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr28597.s
@@ -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
index 00000000000..1f47a4558c7
--- /dev/null
+++ b/ld/testsuite/ld-elf/pr28597.t
@@ -0,0 +1,14 @@ 
+SECTIONS
+{
+  .text           :
+  {
+    *(.text .text.*)
+  }
+  /DISCARD/ : { *(.dynsym) }
+  /DISCARD/ : { *(.dynstr*) }
+  /DISCARD/ : { *(.dynamic*) }
+  /DISCARD/ : { *(.plt*) }
+  /DISCARD/ : { *(.interp*) }
+  /DISCARD/ : { *(.gnu*) }
+  /DISCARD/ : { *(.note.gnu.property) }
+}