Index: lib/Makefile =================================================================== --- lib/Makefile +++ lib/Makefile @@ -18,6 +18,8 @@ ${_libcplusplus} \ ${_libcxxrt} \ libelf \ + libssp \ + libssp_nonshared \ msun # The main list; please keep these sorted alphabetically. Index: lib/libc/secure/stack_protector.c =================================================================== --- lib/libc/secure/stack_protector.c +++ lib/libc/secure/stack_protector.c @@ -58,6 +58,7 @@ __attribute__((__constructor__, __used__)); #endif +extern long __stack_chk_guard[8]; extern int __sysctl(const int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen); @@ -73,8 +74,8 @@ { static const int mib[2] = { CTL_KERN, KERN_ARND }; volatile long tmp_stack_chk_guard[nitems(__stack_chk_guard)]; - size_t len; - int error, idx; + size_t idx, len; + int error; if (__stack_chk_guard[0] != 0) return; @@ -84,7 +85,8 @@ * data into a temporal array, then do manual volatile copy to * not allow optimizer to call memcpy() behind us. */ - error = _elf_aux_info(AT_CANARY, (void *)tmp_stack_chk_guard, + error = _elf_aux_info(AT_CANARY, + __DEQUALIFY(void *, tmp_stack_chk_guard), sizeof(tmp_stack_chk_guard)); if (error == 0 && tmp_stack_chk_guard[0] != 0) { for (idx = 0; idx < nitems(__stack_chk_guard); idx++) { Index: lib/libc/secure/stack_protector_compat.c =================================================================== --- lib/libc/secure/stack_protector_compat.c +++ lib/libc/secure/stack_protector_compat.c @@ -6,15 +6,25 @@ #include __FBSDID("$FreeBSD$"); +#ifdef IN_LIBSSP +#define HIDDEN_ATTR __hidden +#define __stack_chk_fail_local_hidden _stack_chk_fail_local +#else +#define HIDDEN_ATTR +#endif + void __stack_chk_fail(void); +void __stack_chk_fail_local_hidden(void); -#ifdef PIC -void +#if defined(IN_LIBSSP) || defined(PIC) +void HIDDEN_ATTR __stack_chk_fail_local_hidden(void) { __stack_chk_fail(); } +#endif +#ifdef PIC __sym_compat(__stack_chk_fail_local, __stack_chk_fail_local_hidden, FBSD_1.0); #endif Index: lib/libssp/Makefile =================================================================== --- /dev/null +++ lib/libssp/Makefile @@ -0,0 +1,15 @@ +# $FreeBSD$ + +PACKAGE= clibs +SHLIBDIR?= /lib +SHLIB= ssp +SHLIB_MAJOR= 1 + +VERSION_DEF= ${.CURDIR}/Versions.def +SYMBOL_MAPS= ${.CURDIR}/Symbol.map + +.PATH: ${SRCTOP}/lib/libc/secure +CFLAGS+= -I${SRCTOP}/lib/libc/include -DIN_LIBSSP +SRCS= stack_protector.c + +.include Index: lib/libssp/Symbol.map =================================================================== --- /dev/null +++ lib/libssp/Symbol.map @@ -0,0 +1,9 @@ +/* + * $FreeBSD$ + */ + +LIBSSP_1.0 { + __chk_fail; + __stack_chk_fail; + __stack_chk_guard; +}; Index: lib/libssp/Versions.def =================================================================== --- /dev/null +++ lib/libssp/Versions.def @@ -0,0 +1,4 @@ +# $FreeBSD$ + +LIBSSP_1.0 { +}; Index: lib/libssp_nonshared/Makefile =================================================================== --- /dev/null +++ lib/libssp_nonshared/Makefile @@ -0,0 +1,12 @@ +# $FreeBSD$ + +PACKAGE= clibs +LIB= ssp_nonshared +NO_PIC= +MK_PROFILE= no + +.PATH: ${SRCTOP}/lib/libc/secure +CFLAGS+= -I${SRCTOP}/lib/libc/include -DIN_LIBSSP +SRCS= stack_protector_compat.c + +.include