2

如果我有以下 C 代码

int main()
{
    return 77;
}

我可以使用 clang 上的 -S 选项生成 asm 代码以获得以下内容(英特尔语法)

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

4

3 回答 3

7
  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
    

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

    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
于 2013-09-02T17:42:01.530 回答
3

既然你用的是clang,为什么不用clang而不是gcc来编译呢?

clang main.s -mllvm --x86-asm-syntax=intel -o main
于 2013-09-02T17:58:59.853 回答
1

尝试使用 .s 文件调用 gcc。

于 2013-09-02T17:44:28.463 回答