diff options
author | Ryan Arnold <ryanarn@etna.rchland.ibm.com> | 2010-06-11 15:11:10 -0500 |
---|---|---|
committer | Ryan Arnold <ryanarn@etna.rchland.ibm.com> | 2010-06-11 15:11:10 -0500 |
commit | 91ab06c7447d8e123b6670bc8e595c15c9ed991f (patch) | |
tree | bdafad891de236a6791295179f689057639dc855 | |
parent | 165ab209dffe764f7aea8d6b732f84cf5c0bb02c (diff) | |
download | glibc-91ab06c7447d8e123b6670bc8e595c15c9ed991f.tar.gz glibc-91ab06c7447d8e123b6670bc8e595c15c9ed991f.tar.xz glibc-91ab06c7447d8e123b6670bc8e595c15c9ed991f.zip |
Experimental patch to default PPC64 to no-execstack support. This will need
to be abstracted to remove the guards from common files and put the stack initialization into a header file that can be overridden. 2010-06-11 Ryan S. Arnold <rsa@us.ibm.com> * elf/dl-load.c (_dl_map_object_from_fd): Set default stack_flags to no-exec for ARCH_PPC64. * elf/dl-support.c [_dl_stack_flags]: Set default stack_flags to no-exec for ARCH_PPC64. * elf/rtld.c (_dl_starting_up): Set default stack_flags to no-exec for ARCH_PPC64.
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | elf/dl-load.c | 5 | ||||
-rw-r--r-- | elf/dl-support.c | 7 | ||||
-rw-r--r-- | elf/rtld.c | 5 |
4 files changed, 26 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog index 01b1ef6399..0e4cdfb6cf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2010-06-11 Ryan S. Arnold <rsa@us.ibm.com> + + * elf/dl-load.c (_dl_map_object_from_fd): Set default stack_flags to + no-exec for ARCH_PPC64. + * elf/dl-support.c [_dl_stack_flags]: Set default stack_flags to + no-exec for ARCH_PPC64. + * elf/rtld.c (_dl_starting_up): Set default stack_flags to no-exec for + ARCH_PPC64. + 2010-05-28 Luis Machado <luisgpm@br.ibm.com> * sysdeps/powerpc/powerpc32/power7/memcpy.S: Exchange srdi for srwi. diff --git a/elf/dl-load.c b/elf/dl-load.c index 597193c043..ff02fe4fb0 100644 --- a/elf/dl-load.c +++ b/elf/dl-load.c @@ -996,8 +996,13 @@ _dl_map_object_from_fd (const char *name, int fd, struct filebuf *fbp, } } +#if (defined (_ARCH_PPC64) || defined (__powerpc64__)) + /* Default to no-exec stack on PPC64. */ + uint_fast16_t stack_flags = PF_R|PF_W; +#else /* Presumed absent PT_GNU_STACK. */ uint_fast16_t stack_flags = PF_R|PF_W|PF_X; +#endif { /* Scan the program header table, collecting its load commands. */ diff --git a/elf/dl-support.c b/elf/dl-support.c index bcf0e2a560..8d2d616ac5 100644 --- a/elf/dl-support.c +++ b/elf/dl-support.c @@ -126,8 +126,15 @@ ElfW(Phdr) *_dl_phdr; size_t _dl_phnum; uint64_t _dl_hwcap __attribute__ ((nocommon)); + +#if (defined (_ARCH_PPC64) || defined (__powerpc64__)) +/* Default to no-exec stack on PPC64. */ +/* Prevailing state of the stack, PF_X indicating it's executable. */ +ElfW(Word) _dl_stack_flags = PF_R|PF_W; +#else /* Prevailing state of the stack, PF_X indicating it's executable. */ ElfW(Word) _dl_stack_flags = PF_R|PF_W|PF_X; +#endif /* If loading a shared object requires that we make the stack executable when it was not, we do it by calling this function. diff --git a/elf/rtld.c b/elf/rtld.c index 55b84c3bf4..bcaaf90f1a 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -123,7 +123,12 @@ INTVARDEF(_dl_starting_up) struct rtld_global _rtld_global = { /* Default presumption without further information is executable stack. */ +#if (defined (_ARCH_PPC64) || defined (__powerpc64__)) + /* Default to no-exec stack on PPC64. */ + ._dl_stack_flags = PF_R|PF_W, +#else ._dl_stack_flags = PF_R|PF_W|PF_X, +#endif #ifdef _LIBC_REENTRANT ._dl_load_lock = _RTLD_LOCK_RECURSIVE_INITIALIZER, #endif |