gcc - 为什么 -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进行编译。
有人知道为什么我的二进制文件没有得到强化吗?
提前致谢。
解决方案
由checksec脚本完成的强化是启发式完成的:通过_chk
在readelf --dyn-syms
. 所以它只有在以下情况下才能检测到防御工事
memset
您的源代码包含对强化函数( 、memcpy
等)的调用- 代码已通过优化编译(
__OPTIMIZE__
定义了宏) - GCC 没有将它们优化为未经检查的版本或显式循环(参见gimple-fold.c
gimple_fold_builtin_memory_chk
中的示例)
要确定您的特定案例的根本原因,我们需要一个MVCE。
推荐阅读
- docker - 为正在运行的容器设置 AutoRemove false
- installation - 如何在 Inno Setup 中删除以前版本的应用程序添加的文件
- python - Flask restx MarshallingError 格式不正确
- flutter - 如何使用颤振显示画廊中的所有照片?
- php - Laravel 7 Api auth 总是返回 false
- javascript - 防止数据表默认排序
- html - 空标题能否通过可访问性测试
- java - 使用java从浏览器运行用户系统中的exe文件
- python - 计算多维numpy数组元素的内点积
- php - 如何使用带有自定义字段标题的 wp_list_pages() 函数从自定义帖子类型中列出帖子?