Crt0
外觀
程式執行 |
---|
基礎概念 |
代碼類型 |
編譯策略 |
|
知名執行環境 |
著名編譯器及工具鏈 |
crt0(也叫做c0)是連接到C程式上的一組執行啟動常式,它進行在呼叫這個程式的主函數之前所需要的任何初始化工作。它一般的都採用叫做crt0.o的目標文件形式,經常採用匯編語言編寫,連結器自動的將它包括入它所建造的所有可執行檔案中[1]。
簡介
[編輯]crt0包含大多數執行時庫的基本部分。因此,它進行的確切工作依賴於程式的編譯器、作業系統和C標準庫實現[1]。除了執行時環境和工具鏈所需要的初始化工作,crt可以進行編程者定義額外操作,比如執行C++全域構造器和攜帶GCC的((constructor))
屬性的C函數[2][3]。
「crt」表示「C runtime」,「0」表示「最開始」。然而,當程式使用GCC來編譯的時候,它也用於在C之外的語言,對於特殊使用場景可獲得crt0的可替代版本,例如,剖析器gprof要求它的程式同gcrt0一起編譯[4]。
樣例 crt0.s
[編輯]下面是針對linux x86_64的採用at&t語法的例子。
.text
.globl _start
_start: # _start is the entry point known to the linker
xor %ebp, %ebp # effectively RBP := 0, mark the end of stack frames
mov (%rsp), %edi # get argc from the stack (implicitly zero-extended to 64-bit)
lea 8(%rsp), %rsi # take the address of argv from the stack
lea 16(%rsp,%rdi,8), %rdx # take the address of envp from the stack
xor %eax, %eax # per ABI and compatibility with icc
call main # %edi, %rsi, %rdx are the three args (of which first two are C standard) to main
mov %eax, %edi # transfer the return of main to the first argument of _exit
xor %eax, %eax # per ABI and compatibility with icc
call _exit # terminate the program
參見
[編輯]參照
[編輯]- ^ 1.0 1.1 The C Runtime Initialization, crt0.o. embecosm.com. 2010 [2013-12-30]. (原始內容存檔於2013-12-30).
- ^ Program initialization: Creating a C library. osdev.org. 2014-02-25 [2014-04-21]. (原始內容存檔於2014-04-23).
- ^ Calling Global Constructors. osdev.org. 2014-04-08 [2014-04-21]. (原始內容存檔於2014-04-23).
- ^ Compiling a Program for Profiling: GNU gprof. sourceware.org. [2013-12-30]. (原始內容存檔於2013-12-31).