diff options
author | John David Anglin <dave.anglin@bell.net> | 2017-02-20 20:31:57 -0500 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2017-03-15 14:26:37 -0700 |
commit | 8b3caa41b9cb82651e72a0c87aa56719c134000e (patch) | |
tree | c438639a1a1cb7a8f01308bb94912a5c25bee819 | |
parent | 69e0a87cc4c570e3b7218392fc3e743b5bddcce2 (diff) | |
download | glibc-8b3caa41b9cb82651e72a0c87aa56719c134000e.tar.gz glibc-8b3caa41b9cb82651e72a0c87aa56719c134000e.tar.xz glibc-8b3caa41b9cb82651e72a0c87aa56719c134000e.zip |
hppa: Fix setting of __libc_stack_end
The binutils package was recently changed to fix -z relro support on hppa. See ld/21000 for details: https://sourceware.org/bugzilla/show_bug.cgi?id=21000 This exposed a problem with the _dl_start_user function in the RTLD_START define. We need to set __libc_stack_end before it is made read only. For this, we need to define DL_STACK_END. The offset of 0x160 gives the same stack end as the code in _dl_start_user. A build log with the attached patch is here: https://buildd.debian.org/status/fetch.php?pkg=glibc&arch=hppa&ver=2.24-9&stamp=1487639205&raw=0 (cherry picked from commit 5d20a49aaccef5ef7adac93d5ca159f6b7ba0105)
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | sysdeps/hppa/dl-machine.h | 9 |
2 files changed, 9 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog index 8aaf9f825d..d8ed2e4d90 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2017-03-15 John David Anglin <danglin@gcc.gnu.org> + + * sysdeps/hppa/dl-machine.h (DL_STACK_END): Define. + (RTLD_START): Don't record stack end address in _dl_start_user. + 2017-03-02 Florian Weimer <fweimer@redhat.com> [BZ #21015] diff --git a/sysdeps/hppa/dl-machine.h b/sysdeps/hppa/dl-machine.h index 339c7bb771..787b95f502 100644 --- a/sysdeps/hppa/dl-machine.h +++ b/sysdeps/hppa/dl-machine.h @@ -302,6 +302,10 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) #define ARCH_LA_PLTENTER hppa_gnu_pltenter #define ARCH_LA_PLTEXIT hppa_gnu_pltexit +/* Adjust DL_STACK_END to get value we want in __libc_stack_end. */ +#define DL_STACK_END(cookie) \ + ((void *) (((long) (cookie)) + 0x160)) + /* Initial entry point code for the dynamic linker. The C function `_dl_start' is the real entry point; its return value is the user program's entry point. */ @@ -401,11 +405,6 @@ asm ( \ /* Save the entry point in %r3. */ \ " copy %ret0,%r3\n" \ \ - /* Remember the lowest stack address. */ \ -" addil LT'__libc_stack_end,%r19\n" \ -" ldw RT'__libc_stack_end(%r1),%r20\n" \ -" stw %sp,0(%r20)\n" \ - \ /* See if we were called as a command with the executable file \ name as an extra leading argument. */ \ " addil LT'_dl_skip_args,%r19\n" \ |