如何启用 buildroot gcc 安全构建选项,如 _FORTIFY_SOURCE 和堆栈保护程序?
How to enable buildroot gcc security build options like _FORTIFY_SOURCE and stack protector?
我满足了一个要求,可执行二进制文件必须通过https://github.com/slimm609/checksec.sh,
的检查
所以我为我的工具链 gcc 启用了以下构建配置:
_D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now -fstack-protector-all
但是它在编译过程中没有输出任何警告信息,而当我使用主机 gcc build 时它显示正确的警告信息。
下面是我的构建日志:
jason@linux-server:~/tmp/test$ /opt/buildroot-gcc463/usr/bin/mipsel-buildroot-linux-uclibc-gcc -Wall -O2 -D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now -fstack-protector-all -fpie -pie test.c -o testjason
没有任何警告输出。
While in host x86 gcc: In file included from
/usr/include/string.h:640:0,
from test.c:2: In function ‘memcpy’,
inlined from ‘main’ at test.c:28:8: /usr/include/x86_64-linux-gnu/bits/string3.h:51:3: warning: call to
__builtin___memcpy_chk will always overflow destination buffer [enabled by default] return __builtin___memcpy_chk (__dest, __src,
__len, __bos0 (__dest)); ^ In function ‘memset’,
inlined from ‘main’ at test.c:35:8: /usr/include/x86_64-linux-gnu/bits/string3.h:84:3: warning: call to
__builtin___memset_chk will always overflow destination buffer [enabled by default] return __builtin___memset_chk (__dest, __ch,
__len, __bos0 (__dest));
对于构建工具链,我只在 package/gcc/gcc.mk 文件中启用了 libssp:
您的 buildroot 编译器路径表明它是针对 uclibc 的 GCC 4.6。此编译器版本没有您在主机上看到的警告。
此外,uclibc 在任何意义上都不支持 _FORTIFY_SOURCE
,因此如果您必须使用具有该功能的工具链,uclibc 是错误的选择。
我满足了一个要求,可执行二进制文件必须通过https://github.com/slimm609/checksec.sh,
的检查所以我为我的工具链 gcc 启用了以下构建配置:
_D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now -fstack-protector-all
但是它在编译过程中没有输出任何警告信息,而当我使用主机 gcc build 时它显示正确的警告信息。
下面是我的构建日志:
jason@linux-server:~/tmp/test$ /opt/buildroot-gcc463/usr/bin/mipsel-buildroot-linux-uclibc-gcc -Wall -O2 -D_FORTIFY_SOURCE=2 -Wl,-z,relro,-z,now -fstack-protector-all -fpie -pie test.c -o testjason
没有任何警告输出。
While in host x86 gcc: In file included from /usr/include/string.h:640:0, from test.c:2: In function ‘memcpy’, inlined from ‘main’ at test.c:28:8: /usr/include/x86_64-linux-gnu/bits/string3.h:51:3: warning: call to __builtin___memcpy_chk will always overflow destination buffer [enabled by default] return __builtin___memcpy_chk (__dest, __src, __len, __bos0 (__dest)); ^ In function ‘memset’, inlined from ‘main’ at test.c:35:8: /usr/include/x86_64-linux-gnu/bits/string3.h:84:3: warning: call to __builtin___memset_chk will always overflow destination buffer [enabled by default] return __builtin___memset_chk (__dest, __ch, __len, __bos0 (__dest));
对于构建工具链,我只在 package/gcc/gcc.mk 文件中启用了 libssp:
您的 buildroot 编译器路径表明它是针对 uclibc 的 GCC 4.6。此编译器版本没有您在主机上看到的警告。
此外,uclibc 在任何意义上都不支持 _FORTIFY_SOURCE
,因此如果您必须使用具有该功能的工具链,uclibc 是错误的选择。