This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[RFC] [MIPS] Enable non-executable PT_GNU_STACK support
- From: Faraz Shahbazker <faraz dot shahbazker at imgtec dot com>
- To: "binutils at sourceware dot org" <binutils at sourceware dot org>
- Cc: <macro at imgtec dot com>
- Date: Fri, 5 Feb 2016 10:34:56 -0800
- Subject: [RFC] [MIPS] Enable non-executable PT_GNU_STACK support
- Authentication-results: sourceware.org; auth=none
Increment the ABIVERSION to 5 for objects with non-executable stacks
Currently the MIPS FPU emulator uses eXecute Out of Line (XOL) on the stack to
handle instructions in the delay slots of FPU branches. Because of this MIPS
cannot have a non-executable stack. While the solution on the kernel side is
not yet finalized, we propose changes required on the tools-side to make them
ready for a seamless transition whenever a fixed kernel becomes available.
glibc/dynamic linker:
----
* When non-executable stack is requested, first check AT_FLAGS in the
auxiliary vector to decide if this kernel supports a non-executable
stack. Persist with the non-executable mode specified on the
PT_GNU_STACK segment only if kernel supports it, else revert to an
executable stack.
* The 25th bit (1<<24) in AT_FLAGS is reserved for use by the kernel to
indicate that it supports a non-executable stack on MIPS.
* glibc's ABIVERSION is incremented from 3 to 5, so that applications linked
for this glibc can't be accidentally run against older versions. ABIVERSION
4 has been skipped over because it was chosen for IFUNC support, which is
still under review.
Patch under review: https://sourceware.org/ml/libc-alpha/2016-01/msg00567.html
gcc:
----
* Check if assembler/dynamic linker support the new behaviour
(ABIVERSION >= 5). If yes, enable non-executable stack by default
for all objects.
binutils:
----
* Increment the ABIVERSION to 5 for objects with non-executable stacks.
Increment the ABIVERSION for objects requesting non-executable stack to 5.
This change is used by the compiler to decide if it can allow
non-executable stacks as a default.
bfd/ChangeLog:
* bfd/elfxx-mips.c
(_bfd_mips_post_process_headers): Increment ABIVERSION for
non-executable stack.
---
bfd/elfxx-mips.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
index 4ece819..5cd074a 100644
--- a/bfd/elfxx-mips.c
+++ b/bfd/elfxx-mips.c
@@ -16141,6 +16141,9 @@ _bfd_mips_post_process_headers (bfd *abfd, struct bfd_link_info *link_info)
if (mips_elf_tdata (abfd)->abiflags.fp_abi == Val_GNU_MIPS_ABI_FP_64
|| mips_elf_tdata (abfd)->abiflags.fp_abi == Val_GNU_MIPS_ABI_FP_64A)
i_ehdrp->e_ident[EI_ABIVERSION] = 3;
+
+ if (elf_stack_flags (abfd) && !(elf_stack_flags (abfd) & PF_X))
+ i_ehdrp->e_ident[EI_ABIVERSION] = 5;
}
int
--
1.7.9.5