[英]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代碼然后鏈接呢?
是的,gcc生成正確的匯編代碼。
這只是as
。
你應該能夠用as
組裝它並與ld
鏈接:
as -o example.o example.s ld -macosx_version_min 10.8.0 -o example example.o -lSystem
或者,可能更容易,使用gcc
或clang
作為前端:
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.