为什么我的编译中-D_FORTIFY_SOURCE=2没有任何效果?

3
我一直在添加一些“编译标志”,以激活二进制文件中的安全措施。然后我使用 checksec 工具检查这些措施是否已实施。除了FORTIFY之外,我已能激活它们所有。
即使我使用-D_FORTIFY_SOURCE=2编译,checksec仍然输出:

FORTIFY = No, Fortified = 0, Fortifiable = 4

我必须说,我为许多二进制文件使用通用的 CMakeLists.txt,并将 -D_FORTIFY_SOURCE=2 添加到全局 add_compile_options 部分。
对于其他生成的二进制文件,该宏具有预期行为,也就是说,其他二进制文件已被“加固”。
我的应用程序采用 c++17 编写,使用gcc 9.3.0编译,并使用-O2进行编译。
有人知道为什么我的二进制文件没有被加固吗?
提前感谢。
1个回答

4

checksec脚本所做的加固是通过在readelf --dyn-syms的输出中搜索_chk符号来进行启发式检测的。因此,它只能检测到以下情况:

  • 您的源代码包含对被强化函数(memset, memcpy等)的调用。
  • 使用了编译器优化(宏__OPTIMIZE__被定义且大于零)
  • GCC不将其优化为未经检查的版本或显式循环(例如,在gimple-fold.c中看到的gimple_fold_builtin_memory_chk)

为了确定您特定情况的确切原因,我们需要一个MVCE


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接