如果我有以下C代码
int main()
{
return 77;
}
我可以使用clang上的-S选项生成asm代码以获取以下内容(Intel语法)
$clang -O0 -mllvm --x86-asm-syntax=intel main.c -S
然后代码是
.section __TEXT,__text,regular,pure_instructions
.globl _main
.align 4, 0x90
_main: ## @main
.cfi_startproc
## BB#0:
push RBP
Ltmp2:
.cfi_def_cfa_offset 16
Ltmp3:
.cfi_offset rbp, -16
mov RBP, RSP
Ltmp4:
.cfi_def_cfa_register rbp
mov EAX, 77
mov DWORD PTR [RBP - 4], 0
pop RBP
ret
.cfi_endproc
.subsections_via_symbols
然而,无论是gas还是nasm都会生成一个与ld链接的目标文件... clang或gcc会生成实际的“准备好去”asm吗? gcc的默认汇编程序是gas(甚至没有安装在mac os x上......?对于clang来说不一样)。
那么如何手动组装asm代码然后将其链接呢?
答案 0 :(得分:6)
是的,gcc会生成正确的汇编代码。
这只是as
。
您应该能够将其与as
汇总并与ld
相关联:
as -o example.o example.s
ld -macosx_version_min 10.8.0 -o example example.o -lSystem
或者,可能更容易使用gcc
或clang
作为前端:
cc -o example example.s
编辑:完成工作示例:
$ cat example.c
int main()
{
return 77;
}
$ gcc -S example.c -o example.s
$ as -o example.o example.s
$ ld -macosx_version_min 10.8.0 -o example example.o -lSystem
$ ./example
$ echo $?
77
好的,既然你正在使用clang,你也可能想要使用它的汇编程序。混合&匹配的工具链通常以泪水结束:
$ clang -cc1as -filetype obj -mllvm --x86-asm-syntax=intel -o example.o example.s
$ ld -macosx_version_min 10.8.0 -o example example.o -lSystem
答案 1 :(得分:3)
既然你正在使用clang,为什么不用clang而不是gcc编译呢?
clang main.s -mllvm --x86-asm-syntax=intel -o main
答案 2 :(得分:2)
尝试使用.s文件调用gcc。