繁体   English   中英

为什么 -D_FORTIFY_SOURCE=2 对我的编译没有影响?

[英]why does -D_FORTIFY_SOURCE=2 has no effect in my compilation?

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

我不断得到

强化 = 否,强化 = 0,可强化 = 4

即使在使用-D_FORTIFY_SOURCE=2编译之后,来自checksec的 output

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

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

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

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

提前致谢。

checksec脚本完成的强化是启发式完成的:通过在 readelf readelf --dyn-syms的 output 中查找_chk符号。 所以它只能在以下情况下检测到防御工事

  • 您的源代码包含对强化函数( memsetmemcpy等)的调用
  • 代码经过优化编译(宏__OPTIMIZE__已定义且大于零)
  • GCC 没有将它们优化为未经检查的版本或显式循环(参见gimple-fold.c 中的 gimple_fold_builtin_memory_chk gimple_fold_builtin_memory_chk

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM