gcc 11.1及以后-frecord-gcc-switches记录异常,如何恢复旧行为?
GCC 11+中
-frecord-gcc-switches行为变更的原因及恢复方法 你遇到的是GCC 11.1版本对-frecord-gcc-switches选项的行为调整:旧版本会完整记录所有编译命令行参数,而新版本默认只记录精简的编译信息。
查看变更原因的途径
- GCC版本发布说明:查阅GCC 11的官方Release Notes,在调试信息或选项变更章节能找到该行为调整的说明,通常会标注变更动机(比如优化二进制体积、统一信息展示格式)
- GCC代码提交日志:在GCC代码仓库中搜索
-frecord-gcc-switches相关的提交记录,对应的commit会详细说明修改的原因和实现逻辑 - GCC官方手册:查看
-frecord-gcc-switches选项的更新文档,里面会明确新版本的默认行为,以及相关替代选项的说明
恢复旧行为的方法
GCC 11新增了-frecord-full-command-line选项,专门用于恢复旧版本中完整记录命令行参数的行为。编译时添加该参数即可,示例命令:
gcc -Wall -Werror -O3 -frecord-gcc-switches -frecord-full-command-line -DVERSION_THING=123hello example.c
之后用readelf -p .GCC.command.line查看,就能得到和GCC 10.4一致的完整命令行参数列表:
String dump of section '.GCC.command.line': [ 0] -fdiagnostics-color=always [ 1b] -imultiarch x86_64-linux-gnu [ 38] -iprefix /opt/compiler-explorer/gcc-10.4.0/bin/../lib/gcc/x86_64-linux-gnu/10.4.0/ [ 8b] -D VERSION_THING=123hello [ a5] /app/example.c [ b4] -mtune=generic [ c3] -march=x86-64 [ d1] -g [ d4] -O3 [ d8] -Wall [ de] -Werror [ e6] -frecord-gcc-switches [ f9] -frecord-full-command-line
内容的提问来源于stack exchange,提问作者wreckgar23
相关产品推荐
相关产品推荐

