如果我有如下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
但是 as、gas 或 nasm 都不会生成目标文件来与 ld 链接...clang 或 gcc 是否生成实际良好的“准备就绪”asm? gcc 的默认汇编程序是 gas(它甚至没有安装在 mac os x 上...?对于 clang 不是一样的吗)。
那么如何手动汇编asm代码然后链接呢?
最佳答案
是的,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
关于c - 在 Mac OS X 上组装和链接 gcc 生成的程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18578347/