??什么是runtime
在windows上安裝或執行程序,都有機會遇到詞匯——runtime。
CRT(C runtime library)
Microsoft Access 2016 Runtime
microsoft visual c++ runtime library
C Runtime
Visual C++ 2008 Runtime
.NET Common Language Runtime
runtime究竟是什么,首先runtime在英文里是合成單詞,無論是英文還是中文都容易在文字層面被誤解,中文直譯“運行時”,中文的斷句容易引起歧義,究竟是“運行、時”還是“運行時”傻傻分不清。
為了準確描述runtime的實際意思,我認為runtime換成execution environment理解起來更容易:即位應用程序的執行準備運行環境。
運行時庫是在編譯時使用的特殊庫,用于在計算機程序的執行中實現內置于編程語言中的功能,包括:輸入、輸出、內存管理。
crt0
比如C語言需要的最小runtime叫做crt0(C runtime)。“crt”代表 “c runtime”,“0”代表“最基本、最開始”。crt0應該包含如下7個步驟。異常向量配置
_start函數和stack初始化
cache 初始化
清除BSS
構造函數和析構函數處理
C初始化功能
調用main入口這個crt0的結構看起來是不是很熟悉?沒錯,在u-boot源碼啟動代碼看到類似結構。
.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
crt0.S編譯生成crt0.o,今后gcc編譯的所有應用程序前都加上這段內容,既然有crt0,那么再發揮想象力,是不是還會有crt1什么的呢,全盤搜索看到若干crt前綴的*.o文件,這些crt*.o文件合并起來被稱做 “runtime library”
運行時庫和標準庫區別
運行時庫(runtime library)與標準庫(standard library)不是一個東西。
標準庫和運行庫之間有一個非常重要的區別。盡管標準庫定義了程序員可以使用的功能,但不是編程語言的規范的一部分,至少在C語言中不是,運行時庫卻時程序運行所必需的部分。
舉個例子,printf()是C標準庫的一部分,程序的啟動是在運行時庫實現的,啟動過程對程序員不可見,因此,你編寫的程序可以不使用標準庫,但始終需要運行時庫,否則無法運行。老實說,在操作系統上編寫不使用標準庫的應用程序幾乎無實際意義,那樣的程序沒有訪問外設的方法、屏幕上不會輸出令人印象深刻的結果。在裸機上情況就不一樣了,訪問外設不需要系統調用,沒有系統的權限隔離,外設的寄存器也有讀寫權限。
簡單編寫一個只有main
int main(int argc, char **argv){ return 0;}
編譯后看看符號表:gcc a.c
readelf -s a.out很多不知那來的函數符號都來源與crt*.o,如register_tm_clones源于crtbegin.o;__data_start、__libc_start_main源于crt1.o
31: 0 FILE LOCAL DEFAULT ABS crtstuff.c32: 0 FUNC LOCAL DEFAULT 13 deregister_tm_clones33: 0 FUNC
LOCAL DEFAULT 13 register_tm_clones34: 0 FUNC
LOCAL DEFAULT 13 __do_global_dtors_aux35: 1 OBJECT LOCAL DEFAULT 24 completed.732536: 0 OBJECT
LOCAL DEFAULT 19 __do_global_dtors_aux_fin37: 0 FUNC LOCAL DEFAULT 13 frame_dummy38: 0 OBJECT
LOCAL DEFAULT 18 __frame_dummy_init_array_39: 0 FILE LOCAL DEFAULT ABS a.c40: 0 FILE
LOCAL DEFAULT ABS crtstuff.c41: 0 OBJECT LOCAL DEFAULT 17 __FRAME_END__42: 0 FILE
LOCAL DEFAULT ABS 43: 0 NOTYPE LOCAL DEFAULT 18 __init_array_end44: 0 OBJECT
LOCAL DEFAULT 20 _DYNAMIC45: 0 NOTYPE LOCAL DEFAULT 18 __init_array_start46: 0 NOTYPE
LOCAL DEFAULT 16 __GNU_EH_FRAME_HDR47: 0 OBJECT LOCAL DEFAULT 22 _GLOBAL_OFFSET_TABLE_48: 0 FUNC
LOCALDEFAULT 10 _init49: 1 FUNC GLOBAL DEFAULT 13 __libc_csu_fini50: 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTab51: 0 NOTYPE WEAK DEFAULT 23 data_start52: 0 NOTYPE GLOBAL DEFAULT 23 _edata53: 0 FUNC GLOBAL HIDDEN 14 _fini54: 0 FUNC GLOBAL DEFAULT UND
__libc_start_main@@GLIBC_55: 0 NOTYPE GLOBAL DEFAULT 23 __data_start56: 0 NOTYPE WEAK DEFAULT UND
__gmon_start__57: 0 OBJECT GLOBAL HIDDEN 23 __dso_handle58: 4 OBJECT GLOBAL DEFAULT 15 _IO_stdin_used59: 93 FUNC GLOBAL DEFAULT 13 __libc_csu_init60: 0 NOTYPE GLOBAL DEFAULT 24 _end61: 43 FUNC GLOBAL DEFAULT 13 _start62: 0 NOTYPE GLOBAL DEFAULT 24 __bss_start63: 18 FUNC GLOBAL DEFAULT 13 main64: 0 OBJECT GLOBAL HIDDEN 23 __TMC_END__65: 0 NOTYPE WEAK DEFAULT UND
_ITM_registerTMCloneTable66: 0 FUNC WEAK DEFAULT UND __cxa_finalize@@GLIBC_2.2
原文標題:runtime是什么
文章出處:【微信公眾號:嵌入式ARM】歡迎添加關注!文章轉載請注明出處。
責任編輯:haq
-
WINDOWS
+關注
關注
3文章
3524瀏覽量
88430 -
C語言
+關注
關注
180文章
7598瀏覽量
136198
原文標題:runtime是什么
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論