首页 > 解决方案 > 为什么 -D_FORTIFY_SOURCE=2 在我的编译中没有影响?

问题描述

我一直在添加一些“编译标志”来激活我的二进制文件中的安全措施。然后我使用checksec工具检查这些措施是否已实施。除了FORTIFY之外,我已经能够激活所有这些。

我不断得到

FORTIFY = 否,强化 = 0,强化 = 4

即使在使用-D_FORTIFY_SOURCE=2编译后仍作为checksec的输出

我不得不说我对许多二进制文件使用了一个通用的CMakeLists.txt ,并且我在全局add_compile_options部分添加了-D_FORTIFY_SOURCE=2 。

对于所有其他生成的二进制文件,该宏具有预期的行为,即其他二进制文件得到“强化”。

我正在使用gcc 9.3.0,我的应用程序是用c++17编写的,我使用-O2进行编译。

有人知道为什么我的二进制文件没有得到强化吗?

提前致谢。

标签: gccc++17fortify-source

解决方案


checksec脚本完成的强化是启发式完成的:通过_chkreadelf --dyn-syms. 所以它只有在以下情况下才能检测到防御工事

  • memset您的源代码包含对强化函数( 、memcpy等)的调用
  • 代码已通过优化编译(__OPTIMIZE__定义了宏)
  • GCC 没有将它们优化为未经检查的版本或显式循环(参见gimple-fold.cgimple_fold_builtin_memory_chk中的示例)

要确定您的特定案例的根本原因,我们需要一个MVCE


推荐阅读