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

时间:2013-09-02 17:35:23

标签: c macos gcc assembly

如果我有以下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代码然后将其链接呢?

3 个答案:

答案 0 :(得分: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
    

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

    cc -o example example.s
    
  4. 编辑:完成工作示例:

    $ 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。