gdb info source显示的额外编译标志是否为默认?能否禁用?
问题解答
你看到的这些编译标志,除了你手动添加的-g,其余均为GCC 9.3.0在x86-64系统上的默认启用选项,其中部分是架构优化项,部分是安全防护类默认规则,下面逐个说明并给出禁用方式:
一、架构相关默认选项
-mtune=generic:针对通用x86-64处理器做代码生成优化,是x86-64平台的默认调优参数-march=x86-64:指定生成兼容x86-64指令集的代码,64位系统下GCC会默认启用该选项- 注意:不建议直接禁用这两个选项,否则会失去64位架构支持或基础性能优化。如果需要针对特定处理器优化,可使用
-march=native或具体处理器型号(如-march=skylake)覆盖默认值。
- 注意:不建议直接禁用这两个选项,否则会失去64位架构支持或基础性能优化。如果需要针对特定处理器优化,可使用
二、安全防护类默认选项(现代发行版中GCC默认开启的安全机制)
-fasynchronous-unwind-tables:生成异步栈回溯表,用于C++异常处理和程序崩溃时的栈追踪,默认启用- 禁用方式:添加编译参数
-fno-asynchronous-unwind-tables
- 禁用方式:添加编译参数
-fstack-protector-strong:强化版栈溢出检测,能覆盖更多函数场景,多数Linux发行版默认开启该安全防护- 禁用方式:添加
-fno-stack-protector-strong(或-fno-stack-protector关闭所有栈保护)
- 禁用方式:添加
-fstack-clash-protection:防止栈内存与其他内存区域重叠引发的攻击,GCC 8及以上版本默认启用- 禁用方式:添加
-fno-stack-clash-protection
- 禁用方式:添加
-fcf-protection:控制流完整性保护,阻断常见的控制流劫持攻击,x86-64平台GCC 8+默认开启- 禁用方式:添加
-fno-cf-protection
- 禁用方式:添加
验证GCC默认编译选项的方法
如果想确认当前环境下GCC的所有默认参数,可以执行以下命令:
g++ -E -v -x c++ /dev/null 2>&1 | grep -A 20 "cc1plus"
该命令会输出GCC调用C++编译器前端时的完整默认参数列表。
内容的提问来源于stack exchange,提问作者Autechre
相关产品推荐
相关产品推荐

