Hi, I ran into an issue with -fstack-protector on FreeBSD/i386. GCC generates calls to __stack_chk_fail_local that the linker complains are undefined. The following test case shows it:
% cat test.c int main( void ) { return( 0 ); } % gcc46 -o test test.c -fstack-protector-all -fPIE /var/tmp//ccjYQxKu.o: In function `main': test.c:(.text+0x37): undefined reference to `__stack_chk_fail_local' /usr/local/bin/ld: test: hidden symbol `__stack_chk_fail_local' isn't defined /usr/local/bin/ld: final link failed: Bad value collect2: ld returned 1 exit status I managed to fix the problem with the following one line change: --- gcc/gcc.c.orig +++ gcc/gcc.c @@ -601,7 +601,7 @@ #ifndef LINK_SSP_SPEC #ifdef TARGET_LIBC_PROVIDES_SSP -#define LINK_SSP_SPEC "%{fstack-protector:}" +#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all:-lssp_nonshared}" #else #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all:-lssp_nonshared -lssp}" #endif The configure script detects __stack_chk_fail in FreeBSD libc and defines TARGET_LIBC_PROVIDES_SSP, but __stack_chk_fail_local should be statically linked in so (a dynamic) libc should not provide it. My question is now whether the problem is with FreeBSD's SSP implementation (where exactly does GCC expect __stack_chk_fail_local to be defined?) or with GCC (should GCC just always link in ssp_nonshared as in the patch above?).