diff options
-rw-r--r-- | extra/Configs/Config.in | 18 | ||||
-rw-r--r-- | ldso/ldso/ldso.c | 10 | ||||
-rw-r--r-- | libc/misc/internals/__uClibc_main.c | 13 |
3 files changed, 33 insertions, 8 deletions
diff --git a/extra/Configs/Config.in b/extra/Configs/Config.in index 1a34cf750..742424f2d 100644 --- a/extra/Configs/Config.in +++ b/extra/Configs/Config.in @@ -1304,11 +1304,21 @@ config UCLIBC_HAS_SSP default n help Add propolice smashing stack protector to the library. - This requires a patched version of GCC or GCC 4.1, supporting the + This requires GCC 4.1, supporting the -fstack-protector[-all] + options. GCC does not have to provide libssp, the needed + functions are added to ldso/libc instead. + Most people will answer N. + +config UCLIBC_HAS_SSP_COMPAT + bool "Support for gcc-3.x propolice smashing stack protector" + depends on UCLIBC_HAS_SSP + default n + help + Add gcc-3.x propolice smashing stack protector to the library. + This requires a patched version of GCC, supporting the -fstack-protector[-all] options, with the __guard and - __stack_smash_handler, respectively __stack_chk_guard and - __stack_chk_fail functions removed from libgcc. - These functions are added to libc instead. + __stack_smash_handler functions removed from libgcc. + These functions are added to ldso/libc instead. More information at: <http://www.research.ibm.com/trl/projects/security/ssp/> Most people will answer N. diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c index 050569573..eebd26ebe 100644 --- a/ldso/ldso/ldso.c +++ b/ldso/ldso/ldso.c @@ -89,11 +89,16 @@ extern void _start(void); #ifdef __UCLIBC_HAS_SSP__ #include <dl-osinfo.h> uintptr_t stack_chk_guard; -#ifndef THREAD_SET_STACK_GUARD +# ifndef THREAD_SET_STACK_GUARD /* Only exported for architectures that don't store the stack guard canary * in local thread area. */ uintptr_t __stack_chk_guard attribute_relro; +# ifdef __UCLIBC_HAS_SSP_COMPAT__ strong_alias(__stack_chk_guard,__guard) +# endif +# elif __UCLIBC_HAS_SSP_COMPAT__ +uintptr_t __guard attribute_relro; +# endif #endif #endif @@ -268,6 +273,9 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, unsigned long load_addr, stack_chk_guard = _dl_setup_stack_chk_guard (); # ifdef THREAD_SET_STACK_GUARD THREAD_SET_STACK_GUARD (stack_chk_guard); +# ifdef __UCLIBC_HAS_SSP_COMPAT__ + __guard = stack_chk_guard; +# endif # else __stack_chk_guard = stack_chk_guard; # endif diff --git a/libc/misc/internals/__uClibc_main.c b/libc/misc/internals/__uClibc_main.c index c50244494..a63345d68 100644 --- a/libc/misc/internals/__uClibc_main.c +++ b/libc/misc/internals/__uClibc_main.c @@ -61,11 +61,15 @@ uintptr_t stack_chk_guard; /* for gcc-4.1 non-TLS */ uintptr_t __stack_chk_guard attribute_relro; /* for gcc-3.x + Etoh ssp */ -# ifdef __HAVE_SHARED__ +# ifdef __UCLIBC_HAS_SSP_COMPAT__ +# ifdef __HAVE_SHARED__ strong_alias(__stack_chk_guard,__guard) -# else +# else uintptr_t __guard attribute_relro; +# endif # endif +# elif defined __UCLIBC_HAS_SSP_COMPAT__ +uintptr_t __guard attribute_relro; # endif # endif @@ -210,9 +214,12 @@ void __uClibc_init(void) stack_chk_guard = _dl_setup_stack_chk_guard(); # ifdef THREAD_SET_STACK_GUARD THREAD_SET_STACK_GUARD (stack_chk_guard); +# ifdef __UCLIBC_HAS_SSP_COMPAT__ + __guard = stack_chk_guard; +# endif # else __stack_chk_guard = stack_chk_guard; -# ifndef __HAVE_SHARED__ +# if !defined __HAVE_SHARED__ && defined __UCLIBC_HAS_SSP_COMPAT__ __guard = stack_chk_guard; # endif # endif |