簡體   English   中英

在Mac OS X上組裝和鏈接gcc生成的程序集

[英]Assembling and Linking gcc generated assembly on Mac OS X

如果我有以下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代碼然后鏈接呢?

  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 

編輯:完整的工作示例:

$ 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

既然你正在使用clang,為什么不用clang而不是gcc編譯呢?

clang main.s -mllvm --x86-asm-syntax=intel -o main

嘗試使用.s文件調用gcc。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM