[binutils-gdb] PR27952, Disallow ET_DYN DF_1_PIE linker input
Alan Modra
amodra@sourceware.org
Fri Jun 11 08:04:38 GMT 2021
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=f64b9b13ce4bb927f47a1fe0257c3794c6357c8c
commit f64b9b13ce4bb927f47a1fe0257c3794c6357c8c
Author: Alan Modra <amodra@gmail.com>
Date: Fri Jun 11 14:06:47 2021 +0930
PR27952, Disallow ET_DYN DF_1_PIE linker input
This patch adds a new elf_tdata flag, is_pie, set during the linker's
open_input_bfds processing. The flag is then used to reject attempts
to link a PIE as if it were a shared library.
bfd/
PR 27952
* elf-bfd.h (struct elf_obj_tdata): Add is_pie.
* elflink.c (elf_link_add_object_symbols): Set is_pie.
ld/
PR 27952
* ldelf.c (ldelf_after_open): Error on input PIEs too.
Diff:
---
bfd/ChangeLog | 6 ++++++
bfd/elf-bfd.h | 3 +++
bfd/elflink.c | 2 ++
ld/ChangeLog | 5 +++++
ld/ldelf.c | 4 +++-
5 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index d1a92dc594d..ad63f9cacfb 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2021-06-11 Alan Modra <amodra@gmail.com>
+
+ PR 27952
+ * elf-bfd.h (struct elf_obj_tdata): Add is_pie.
+ * elflink.c (elf_link_add_object_symbols): Set is_pie.
+
2021-06-09 Nick Clifton <nickc@redhat.com>
PR 27666
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index 92b1722eacb..8f985ab8917 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -2080,6 +2080,9 @@ struct elf_obj_tdata
symbols. */
unsigned int bad_symtab : 1;
+ /* Set if DT_FLAGS_1 has DF_1_PIE set. */
+ unsigned int is_pie : 1;
+
/* Information grabbed from an elf core file. */
struct core_elf_obj_tdata *core;
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 0e1871aaac9..c9a6e78be79 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -4349,6 +4349,8 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
unsigned int tagv = dyn.d_un.d_val;
audit = bfd_elf_string_from_elf_section (abfd, shlink, tagv);
}
+ if (dyn.d_tag == DT_FLAGS_1)
+ elf_tdata (abfd)->is_pie = (dyn.d_un.d_val & DF_1_PIE) != 0;
}
free (dynbuf);
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 7ae7613dc77..2d130b455ff 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,8 @@
+2021-06-11 Alan Modra <amodra@gmail.com>
+
+ PR 27952
+ * ldelf.c (ldelf_after_open): Error on input PIEs too.
+
2021-06-09 Nick Clifton <nickc@redhat.com>
PR 27666
diff --git a/ld/ldelf.c b/ld/ldelf.c
index 4d4d9ca0517..21e655bb55c 100644
--- a/ld/ldelf.c
+++ b/ld/ldelf.c
@@ -1048,7 +1048,9 @@ ldelf_after_open (int use_libpath, int native, int is_linux, int is_freebsd,
&& elf_tdata (abfd) != NULL
&& elf_tdata (abfd)->elf_header != NULL
/* FIXME: Maybe check for other non-supportable types as well ? */
- && elf_tdata (abfd)->elf_header->e_type == ET_EXEC)
+ && (elf_tdata (abfd)->elf_header->e_type == ET_EXEC
+ || (elf_tdata (abfd)->elf_header->e_type == ET_DYN
+ && elf_tdata (abfd)->is_pie)))
einfo (_("%F%P: cannot use executable file '%pB' as input to a link\n"),
abfd);
}
More information about the Binutils-cvs
mailing list