Clang使用的汇编器是什么?能否搭配GNU汇编器(/usr/bin/as)使用?
能否将GNU汇编器与Clang搭配使用?
当然可以!这是完全可行的操作,下面结合你的环境信息给你详细解释和实操步骤:
为什么你之前没看到Clang调用as?
从你提供的clang -v main.c输出能看到,Clang的前端clang-3.4 -cc1默认用了-emit-obj参数——这意味着它会直接生成目标文件(.o),跳过了生成平台原生汇编代码(.s)再调用外部汇编器的环节。这就是你的strace结果里找不到/usr/bin/as调用记录的原因,因为根本没走外部汇编这一步。
至于llvm-as,它是用来处理LLVM IR专属汇编格式(.ll文件)的工具,和GNU as负责的平台原生汇编(.s)不是一回事,所以你编译普通C代码时不会用到它。
如何让Clang使用GNU汇编器
有两种常用方式可以实现:
方式1:分步编译(生成汇编→汇编→链接)
- 第一步:让Clang生成兼容GNU语法的汇编代码
执行后会得到clang -S main.cmain.s文件,里面是适配你x86_64-linux-gnu平台的GNU风格汇编代码。 - 第二步:用GNU as将汇编文件转为目标文件
/usr/bin/as -o main.o main.s - 第三步:用Clang完成链接生成可执行文件
clang main.o -o a.out
方式2:让Clang直接调用外部汇编器
使用-no-integrated-as选项,强制Clang禁用内置汇编器,转而调用系统默认的外部汇编器(也就是你的/usr/bin/as):
clang -no-integrated-as main.c -o a.out
这时再用strace追踪,就能看到Clang调用/usr/bin/as的exec操作记录了。
关于你的环境兼容性
从你提供的信息来看,系统里已经预装了GNU as(随GCC一同安装),且Clang已经识别到了GCC的安装路径,所以搭配使用不会有兼容性问题——Clang会自动针对目标平台生成兼容GNU as的汇编代码。
内容的提问来源于stack exchange,提问作者Kamath
相关产品推荐
相关产品推荐

