0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在windows上安裝或執(zhí)行程序遇到的runtime是什么?

Q4MP_gh_c472c21 ? 來(lái)源:寫個(gè)解 ? 作者:吳夢(mèng)龍 ? 2021-03-17 09:51 ? 次閱讀

??什么是runtime

在windows上安裝或執(zhí)行程序,都有機(jī)會(huì)遇到詞匯——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在英文里是合成單詞,無(wú)論是英文還是中文都容易在文字層面被誤解,中文直譯“運(yùn)行時(shí)”,中文的斷句容易引起歧義,究竟是“運(yùn)行、時(shí)”還是“運(yùn)行時(shí)”傻傻分不清。

為了準(zhǔn)確描述runtime的實(shí)際意思,我認(rèn)為runtime換成execution environment理解起來(lái)更容易:即位應(yīng)用程序的執(zhí)行準(zhǔn)備運(yùn)行環(huán)境。

運(yùn)行時(shí)庫(kù)是在編譯時(shí)使用的特殊庫(kù),用于在計(jì)算機(jī)程序的執(zhí)行中實(shí)現(xiàn)內(nèi)置于編程語(yǔ)言中的功能,包括:輸入、輸出、內(nèi)存管理。

crt0

比如C語(yǔ)言需要的最小runtime叫做crt0(C runtime)?!癱rt”代表 “c runtime”,“0”代表“最基本、最開始”。crt0應(yīng)該包含如下7個(gè)步驟。異常向量配置

_start函數(shù)和stack初始化

cache 初始化

清除BSS

構(gòu)造函數(shù)和析構(gòu)函數(shù)處理

C初始化功能

調(diào)用main入口這個(gè)crt0的結(jié)構(gòu)看起來(lái)是不是很熟悉?沒錯(cuò),在u-boot源碼啟動(dòng)代碼看到類似結(jié)構(gòu)。

.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編譯的所有應(yīng)用程序前都加上這段內(nèi)容,既然有crt0,那么再發(fā)揮想象力,是不是還會(huì)有crt1什么的呢,全盤搜索看到若干crt前綴的*.o文件,這些crt*.o文件合并起來(lái)被稱做 “runtime library”

運(yùn)行時(shí)庫(kù)和標(biāo)準(zhǔn)庫(kù)區(qū)別

運(yùn)行時(shí)庫(kù)(runtime library)與標(biāo)準(zhǔn)庫(kù)(standard library)不是一個(gè)東西。

標(biāo)準(zhǔn)庫(kù)和運(yùn)行庫(kù)之間有一個(gè)非常重要的區(qū)別。盡管標(biāo)準(zhǔn)庫(kù)定義了程序員可以使用的功能,但不是編程語(yǔ)言的規(guī)范的一部分,至少在C語(yǔ)言中不是,運(yùn)行時(shí)庫(kù)卻時(shí)程序運(yùn)行所必需的部分。

舉個(gè)例子,printf()是C標(biāo)準(zhǔn)庫(kù)的一部分,程序的啟動(dòng)是在運(yùn)行時(shí)庫(kù)實(shí)現(xiàn)的,啟動(dòng)過(guò)程對(duì)程序員不可見,因此,你編寫的程序可以不使用標(biāo)準(zhǔn)庫(kù),但始終需要運(yùn)行時(shí)庫(kù),否則無(wú)法運(yùn)行。老實(shí)說(shuō),在操作系統(tǒng)上編寫不使用標(biāo)準(zhǔn)庫(kù)的應(yīng)用程序幾乎無(wú)實(shí)際意義,那樣的程序沒有訪問(wèn)外設(shè)的方法、屏幕上不會(huì)輸出令人印象深刻的結(jié)果。在裸機(jī)上情況就不一樣了,訪問(wèn)外設(shè)不需要系統(tǒng)調(diào)用,沒有系統(tǒng)的權(quán)限隔離,外設(shè)的寄存器也有讀寫權(quán)限。

簡(jiǎn)單編寫一個(gè)只有main

int main(int argc, char **argv){ return 0;}

編譯后看看符號(hào)表:gcc a.c

readelf -s a.out很多不知那來(lái)的函數(shù)符號(hào)都來(lái)源與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

原文標(biāo)題:runtime是什么

文章出處:【微信公眾號(hào):嵌入式ARM】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • WINDOWS
    +關(guān)注

    關(guān)注

    3

    文章

    3503

    瀏覽量

    87885
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134086

原文標(biāo)題:runtime是什么

文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    labview生成可執(zhí)行程序后vi都在同一路徑下嗎

    LabVIEW中,當(dāng)您生成可執(zhí)行程序(exe文件)后,VI(虛擬儀器)并不直接以文件的形式存在于可執(zhí)行文件的同一物理路徑下。實(shí)際,LabVIEW的可
    的頭像 發(fā)表于 09-04 17:06 ?223次閱讀

    在運(yùn)行Windows11的系統(tǒng)安裝KitProg編程器驅(qū)動(dòng)程序時(shí)遇到的疑問(wèn)求解

    我在運(yùn)行 Windows 11 的系統(tǒng)安裝 KitProg 編程器驅(qū)動(dòng)程序時(shí)遇到困難。 每次嘗試安裝
    發(fā)表于 05-21 06:35

    用Keil上下載按鈕下載執(zhí)行程序和直接斷電執(zhí)行程序,有什么不一樣?

    連接上J-Link或者ST-Link的時(shí)候,可以直接在Keil上點(diǎn)擊下面的按鈕下載程序執(zhí)行程序(當(dāng)然要勾選下載復(fù)位后自動(dòng)執(zhí)行) 想問(wèn)的是,這樣下載
    發(fā)表于 05-06 06:43

    RK3568安裝RT-Thread,根據(jù)板級(jí)支持包操作時(shí)遇到的疑問(wèn)求解

    我想在RK3568安裝RT-Thread,根據(jù)板級(jí)支持包操作時(shí),遇到了一些疑問(wèn),大佬求教! 我已經(jīng)完成了編譯部分,生成了rtthread.elf與rtthread.bin文件 請(qǐng)問(wèn)燒錄進(jìn)SD
    發(fā)表于 03-01 06:23

    ADuCM320 flash數(shù)據(jù)區(qū)擦/寫操作時(shí),無(wú)法從這塊flash執(zhí)行程序怎么解決?

    UG看到說(shuō)一塊128K flash擦除寫操作時(shí),就無(wú)法從這塊flash
    發(fā)表于 01-11 06:34

    idea如何多次運(yùn)行程序

    計(jì)算機(jī)編程的世界中,我們通常需要多次運(yùn)行程序來(lái)測(cè)試其性能、調(diào)試錯(cuò)誤或者進(jìn)行大規(guī)模的數(shù)據(jù)處理。但是有些編程初學(xué)者可能會(huì)困惑于如何多次運(yùn)行程序的問(wèn)題。本文將會(huì)詳細(xì)介紹如何多次運(yùn)行程序的不
    的頭像 發(fā)表于 12-06 14:59 ?1104次閱讀

    cpu執(zhí)行程序內(nèi)部變化

    CPU(Central Processing Unit)是計(jì)算機(jī)的核心部件之一,它負(fù)責(zé)執(zhí)行計(jì)算機(jī)程序的指令,并進(jìn)行數(shù)據(jù)處理和控制操作。CPU執(zhí)行程序時(shí)會(huì)經(jīng)歷一系列復(fù)雜的內(nèi)部變化。本文
    的頭像 發(fā)表于 12-05 11:26 ?496次閱讀

    LabVIEW不同操作系統(tǒng)使VI、可執(zhí)行文件安裝程序

    LabVIEW不同操作系統(tǒng)使VI、可執(zhí)行文件安裝程序 LabVIEW可以
    發(fā)表于 12-02 21:47

    怎么讓python執(zhí)行完后再執(zhí)行

    Python中,可以使用一些技術(shù)來(lái)確保程序執(zhí)行完畢后再執(zhí)行其他任務(wù)。下面將詳細(xì)介紹幾種方法。 一、使用阻塞方式執(zhí)行程序 阻塞方式是最簡(jiǎn)單的
    的頭像 發(fā)表于 11-29 15:09 ?2585次閱讀

    安裝Linux后windows在哪啟動(dòng)

    操作系統(tǒng)引導(dǎo)加載程序,可以管理多個(gè)操作系統(tǒng)的啟動(dòng)。它允許用戶系統(tǒng)啟動(dòng)時(shí)選擇要運(yùn)行的操作系統(tǒng)。本文將詳細(xì)介紹 Linux 安裝Windows 的啟動(dòng)位置以及相關(guān)信息。
    的頭像 發(fā)表于 11-28 15:02 ?935次閱讀

    怎樣codeblocks編寫程序

    如何在CodeBlocks編寫程序,并提供一些有用的技巧和建議。 要在CodeBlocks編寫程序,首先需要下載和安裝它。你可以從官方網(wǎng)
    的頭像 發(fā)表于 11-26 09:26 ?1109次閱讀

    Windows下編譯工具CMake的安裝和最簡(jiǎn)使用

    MCU的開發(fā)環(huán)境一般Windows操作系統(tǒng),簡(jiǎn)單的工程一般直接編寫Makefile文件后使用make工具構(gòu)建程序,復(fù)雜的工程一般借助CMake來(lái)生成Makefile文件后使用mak
    的頭像 發(fā)表于 11-14 10:18 ?6109次閱讀
    <b class='flag-5'>Windows</b>下編譯工具CMake的<b class='flag-5'>安裝</b>和最簡(jiǎn)使用

    用于分析可執(zhí)行程序和內(nèi)存轉(zhuǎn)儲(chǔ)的命令行工具介紹

    Axf Tool 是桃芯科技一個(gè)用于分析可執(zhí)行程序和內(nèi)存轉(zhuǎn)儲(chǔ)的命令行工具。該工具已集成到 ingWizard 的項(xiàng)目快捷菜單里。
    的頭像 發(fā)表于 11-03 17:00 ?1020次閱讀
    用于分析可<b class='flag-5'>執(zhí)行程序</b>和內(nèi)存轉(zhuǎn)儲(chǔ)的命令行工具介紹

    STM8外掛SDRAM怎么才能執(zhí)行程序?

    STM8外掛SDRAM怎么才能執(zhí)行程序
    發(fā)表于 10-25 08:19

    Windows11Linux安裝教程

    超簡(jiǎn)單,不安裝虛擬機(jī),Windows11運(yùn)行Linux。
    發(fā)表于 10-24 15:11 ?1106次閱讀
    <b class='flag-5'>Windows</b>11<b class='flag-5'>上</b>Linux<b class='flag-5'>安裝</b>教程