On 2023-11-10 5:16 p.m., Sam James wrote:
John David Anglin <dave.anglin@xxxxxxxx> writes:
On 2023-11-10 4:32 p.m., Sam James wrote:
John David Anglin <dave.anglin@xxxxxxxx> writes:
On 2023-11-10 3:38 p.m., Helge Deller wrote:
On 11/10/23 21:12, John David Anglin wrote:
On 2023-11-10 3:01 p.m., Helge Deller wrote:
On HPPA, we still need executable stacks, so this option doesn't work
and leads to a segfault on boot.
For kernel we don't need it any longer.
But there might be dependencies on glibc version and/or combination.
So, I've currently lost overview if we still need executable stacks...
FWIW, I recently changed gcc-14 to enable GNU stack notes and fixed a bug in the
32-bit PA 2.0 trampoline template. All execute stack tests in glibc now pass with gcc-14.
Yes, I saw your commits.
So, any code compiled with >= gcc-14 should be fine with non-writeable stacks?
Not exactly. An executable stack is still needed for nested functions. They are still called
via a stack trampoline. The GNU stack note indicates whether an object needs an executable
stack or not. These notes are collected by linker. The glibc loader determines whether to setup
an executable stack or not.
It would be easier if it would be a glibc dependency (for distribution maintainers)...
I'm not aware of any glibc dependency...
I think once gcc-14 becomes the default compiler, we will have to enable GNU stack notes in
previous gcc versions. We will still have executable stacks until everything is rebuilt.
We will need to update that default in Binutils too, I think. That
configure arg is working OK for me, but I did not try systemd yet.
Currently, there are no architecture dependencies in the ld --enable-warn-execstack and --enable-default-execstack
configure options. The -z execstack and -z noexecstack ld options can override the GNU notes, or lack thereof. We
may have to fix some assembly code. Maybe binutils should be built with --enable-warn-execstack once we switch
to gcc-14. I don't think we want --enable-default-execstack after switching to gcc-14.
Are you sure? I just did some more digging now...
* It looks like targets can set elf_backend_default_execstack in
bfd/elf-*.c to override the default, see e.g. 81cd0a49c9e5f28c0fec391e449ea3272077c432 for cris.
* See acd65fa610df09a0954b8fecdadf546215263c5d where HPPA's default got changed.
* ld/configure.tgt still has some suppression for HPPA's default for
warnings.
I think we may need to, in due course, set elf_backend_default_execstack
in bfd/elf32-hppa.c, and then drop those bits in ld/configure.tgt too?
You are right about both. We have in ld/configure.tgt:
if test "${ac_default_ld_warn_execstack}" = 2; then
case "${targ}" in
# The HPPA port needs to support older kernels that
# use executable stacks for signals and syscalls.
# Many MIPS targets use executable stacks.
hppa*-*-* | \
mips*-*-*)
ac_default_ld_warn_execstack=0
;;
*)
;;
esac
fi
We also may need:
#define elf_backend_default_execstack 0
in elf32-hppa.c at some point.
I think when GNU stack notes are present, they determine whether the stack in an executable will be executable or not.
But I could be wrong 🙁
I'll try building binutils with gcc-14.
Dave
--
John David Anglin dave.anglin@xxxxxxxx