diff options
author | Roland McGrath <roland@gnu.org> | 2003-09-24 01:56:08 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2003-09-24 01:56:08 +0000 |
commit | c70ba48888000f00556aa91348c9c5a33a508b49 (patch) | |
tree | eb0d2bf8d0d96ff29d929d6ba2efe397262c8109 /elf/rtld.c | |
parent | 217ed70e1381922db0d0d7fa41e4938114848251 (diff) | |
download | glibc-c70ba48888000f00556aa91348c9c5a33a508b49.tar glibc-c70ba48888000f00556aa91348c9c5a33a508b49.tar.gz glibc-c70ba48888000f00556aa91348c9c5a33a508b49.tar.bz2 glibc-c70ba48888000f00556aa91348c9c5a33a508b49.zip |
* elf/rtld.c (dl_main): In rtld_is_main case, reinitialize
GL(dl_stack_flags) according to rtld's own PT_GNU_STACK.
Move GL(dl_make_stack_executable_hook) initialization up.
* elf/tst-execstack-prog.c: New file.
* elf/Makefile (tests-execstack-yes): Add it.
(LDFLAGS-tst-execstack-prog): New variable.
Diffstat (limited to 'elf/rtld.c')
-rw-r--r-- | elf/rtld.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/elf/rtld.c b/elf/rtld.c index c17f621cc9..d57d8838ac 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -648,6 +648,10 @@ dl_main (const ElfW(Phdr) *phdr, GL(dl_rtld_unlock_recursive) = rtld_lock_default_unlock_recursive; #endif + /* The explicit initialization here is cheaper than processing the reloc + in the _rtld_local definition's initializer. */ + GL(dl_make_stack_executable_hook) = &_dl_make_stack_executable; + /* Process the environment variable which control the behaviour. */ process_envvars (&mode); @@ -748,6 +752,25 @@ of this helper program; chances are you did not intend to run this program.\n\ objects. */ _dl_init_paths (library_path); + /* The initialization of _dl_stack_flags done below assumes the + executable's PT_GNU_STACK may have been honored by the kernel, and + so a PT_GNU_STACK with PF_X set means the stack started out with + execute permission. However, this is not really true if the + dynamic linker is the executable the kernel loaded. For this + case, we must reinitialize _dl_stack_flags to match the dynamic + linker itself. If the dynamic linker was built with a + PT_GNU_STACK, then the kernel may have loaded us with a + nonexecutable stack that we will have to make executable when we + load the program below unless it has a PT_GNU_STACK indicating + nonexecutable stack is ok. */ + + for (ph = phdr; ph < &phdr[phnum]; ++ph) + if (ph->p_type == PT_GNU_STACK) + { + GL(dl_stack_flags) = ph->p_flags; + break; + } + if (__builtin_expect (mode, normal) == verify) { const char *objname; @@ -954,10 +977,6 @@ of this helper program; chances are you did not intend to run this program.\n\ _exit (has_interp ? 0 : 2); } - /* The explicit initialization here is cheaper than processing the reloc - in the _rtld_local definition's initializer. */ - GL(dl_make_stack_executable_hook) = &_dl_make_stack_executable; - if (! rtld_is_main) /* Initialize the data structures for the search paths for shared objects. */ |