Zim*_*m3r 2 c macos assembly gcc
如果我有以下C代码
int main()
{
return 77;
}
Run Code Online (Sandbox Code Playgroud)
我可以使用clang上的-S选项生成asm代码以获取以下内容(Intel语法)
$clang -O0 -mllvm --x86-asm-syntax=intel main.c -S
Run Code Online (Sandbox Code Playgroud)
那么代码就是
.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
Run Code Online (Sandbox Code Playgroud)
然而,无论是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
Run Code Online (Sandbox Code Playgroud)
或者,可能更容易,通过使用gcc或clang作为前端:
cc -o example example.s
Run Code Online (Sandbox Code Playgroud)编辑:完整的工作示例:
$ 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
Run Code Online (Sandbox Code Playgroud)
好的,既然你正在使用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
Run Code Online (Sandbox Code Playgroud)