代码之家  ›  专栏  ›  技术社区  ›  Jason.fang

如何启用buildroot gcc安全构建选项,如\u FORTIFY\u SOURCE和stack protector?

  •  0
  • Jason.fang  · 技术社区  · 7 年前

    我满足了一个要求,可执行二进制文件必须通过检查 https://github.com/slimm609/checksec.sh ,

    因此,我为我的工具链gcc启用了以下构建配置:

    _D_FORTIFY_SOURCE=2  -Wl,-z,relro,-z,now -fstack-protector-all 
    

    但在编译期间,它没有输出任何警告消息,而在我使用主机gcc构建时,它正确地显示了警告消息。

    下面是我的构建日志 :

    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, 来自测试。c: 2:在函数memcpy中, 测试时从主管道内联。c: 28:8:/usr/include/x86_64-linux-gnu/bits/string3。h: 51:3:警告:呼叫 __builtin\uuuu memcpy\u chk将始终溢出目标缓冲区[默认情况下启用]返回\uu builtin\uuu memcpy\u chk(\uu dest,\uu src, __len,_ubos0(_udest));^在函数memset中, __builtin\uuuu memset\u chk将始终溢出目标缓冲区[默认情况下启用]返回\uu builtin\uuu memset\u chk(\uu dest,\uu ch, __len,_ubos0(_udest));

    1 回复  |  直到 7 年前
        1
  •  1
  •   Florian Weimer    7 年前

    您的buildroot编译器路径表明它是针对uclibc的GCC 4.6。此编译器版本没有您在主机上看到的警告。

    此外,uclibc不支持 _FORTIFY_SOURCE 在任何真正意义上,如果您必须使用具有该功能的工具链,uclibc是错误的选择。