如何配置Bazel生成C/C++程序的汇编文件(含测试场景)
如何让Bazel输出C/C++程序的汇编文件
核心思路:通过Bazel配置传递编译选项
无需修改现有BUILD文件,只需通过配置文件或命令行参数传递编译器生成汇编的选项,即可兼容GCC和Clang(两者核心生成选项一致)。
方法1:命令行临时开启(手动开关)
执行bazel test或bazel build时,添加以下参数,直接让所有C/C++目标生成汇编文件:
bazel test //... --copt="-S" --copt="-fno-asynchronous-unwind-tables" --copt="-masm=intel"
-S:告知编译器仅生成汇编文件,跳过后续编译链接步骤-fno-asynchronous-unwind-tables:可选,移除冗余的unwind表,简化汇编代码-masm=intel:可选,切换为Intel格式汇编(默认是AT&T格式)
执行完成后,汇编文件会保存在Bazel输出目录(通常为bazel-out/<平台>/bin/下对应目标的子目录,后缀为.s)。
方法2:通过.bazelrc配置文件持久化管控
若不想每次输入命令行参数,可在项目根目录创建或修改.bazelrc文件,添加专属配置组实现一键开关:
# 定义名为"asm"的全局配置组 build:asm --copt="-S" build:asm --copt="-fno-asynchronous-unwind-tables" # 可选:指定汇编格式 build:asm --copt="-masm=intel" # 单独给test目标配置(可选) test:asm --copt="-S" test:asm --copt="-fno-asynchronous-unwind-tables"
使用时只需在命令行追加--config=asm:
# 仅测试阶段生成汇编 bazel test //... --config=asm # 构建阶段生成汇编 bazel build //... --config=asm
这种方式完全无需改动现有BUILD规则,所有配置集中在.bazelrc,同时兼容GCC和Clang。
注意事项
- 使用
-S选项后,Bazel不会执行链接步骤,因此测试目标不会实际运行,仅生成汇编文件供你检查内联行为。 - 若需同时保留可执行文件和汇编,可改用
-save-temps替代-S,编译器会保留预处理、汇编等所有中间文件:
对应bazel test //... --copt="-save-temps".bazelrc配置:build:save-temps --copt="-save-temps" - 若只需针对特定目标生成汇编,可在命令行指定目标路径,比如
bazel test //my/test:target --config=asm,避免生成所有目标的汇编文件。
内容的提问来源于stack exchange,提问作者lmonninger
相关产品推荐
相关产品推荐

