在Mac OS X上组装和链接gcc生成的程序集

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代码然后链接呢?

Car*_*rum 6

  1. 是的,gcc生成正确的汇编代码.

  2. 这只是as.

  3. 你应该能够与它组装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)

    或者,可能更容易,通过使用gccclang作为前端:

    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)