我遇到了要求,可执行二进制文件必须通过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
没有任何警告输出。
在主机x86 gcc中:包含来自的文件 /usr/include/string.h:640:0, 来自test.c:2:在函数'memcpy'中, 从test.c:28:8中的'main'内联:/usr/include/x86_64-linux-gnu/bits/string3.h:51:3:警告:致电 __builtin___memcpy_chk将始终溢出目标缓冲区[默认启用] return __builtin___memcpy_chk(__dest,__ rc, __len,__bos0(__dest)); ^在函数'memset'中, 在test.c:35:8内联'main':/usr/include/x86_64-linux-gnu/bits/string3.h:84:3:警告:致电 __builtin___memset_chk将始终溢出目标缓冲区[默认启用] return __builtin___memset_chk(__dest,__ ch, __len,__bos0(__dest));
对于构建工具链,我只在package / gcc / gcc.mk文件中启用了libssp:
答案 0 :(得分:1)
您的buildroot编译器路径表明它是针对uclibc的GCC 4.6。此编译器版本没有您在主机上看到的警告。
此外,uclibc在任何实际意义上都不支持_FORTIFY_SOURCE
,所以如果你必须使用具有该功能的工具链,那么uclibc是错误的选择。