鏈結 裝載與庫 執行庫

2021-07-01 19:24:55 字數 1425 閱讀 4644

本篇簡單介紹下執行庫,並總結下乙個程式的最終執行環境。

作業系統裝載程式之後,並不是馬上從main()函式開始。程式執行的第一行**是從elf可執行檔案頭中的入口位址開始的。從入口位址開始的**,會負責準備好main函式執行所需要的環境,並且負責呼叫main函式。之後,你才可以放心的在main函式中申請記憶體、使用系統呼叫,訪問i/o等等操作。在呼叫main函式返回後,再由後續的**做清理,結束程序。

從入口位址開始執行以上功能的**的函式,我們就稱其為入口函式,它屬於執行庫的一部分。

1) 作業系統在進行完鏈結和裝載後,控制權交給程式的入口函式,這個入口實際上是乙個程式的初始化和結束部分;

2) 入口函式對執行庫和程式執行環境進行初始化,包括堆、i/o、執行緒、全域性變數構造,等等;

(入口函式最重要的部分,堆初始化和i/o初始化。在main函式中使用malloc申請記憶體,printf列印,使用系統呼叫、觸發異常、訪問i/o,都是在這一步做好了準備工作)

3) 入口函式完成初始化之後,呼叫main函式,正式開始執行主體部分;

4) main函式執行完畢,返回入口函式。入口函式進行清理工作,包括全域性變數析構、堆銷毀、關閉i/o等,然後進行系統呼叫結束程序。

任何乙個程式,它的背後都有乙個龐大的**集合,以使得程式正常執行。這個集合至少包括入口函式,及其所依賴的函式所構成的函式集合,還包括各種標準庫函式的實現。這樣乙個**集合我們成為執行時庫(runtime library)。

對於c語言的執行庫,就叫做c執行庫。linux下c庫是glibc(gnu c library),windows下就是msvc(microsoft visual c run-time)。其中,msvc還提供c++語言的標準庫。

c庫的主要功能:

1) 啟動與退出:包括入口函式及入口函式所依賴的其他函式等;

2) 標準函式:由c語言標準規定的c標準庫所擁有的函式實現;

3) i/o: i/o功能的封裝和實現,主要就是檔案的i/o操作,如fopen、fread等;

4) 堆:堆的封裝和實現,諸如malloc,free等;

5) 語言、除錯**等。

其中,在這些執行庫的組成成分中,c標準庫佔據了主要地位。

我們一般很少涉及執行庫的開發,因此,只要清楚執行庫的概念,知道其在程式執行過程中起的作用,這個目前對我來說就足夠了。所以,細節的部分就不整理了。

後續,自己手動實現下書中的minicrt,完成後再提交到github,完成後再更新。

至此,鏈結、裝載與庫的幾大主要部分的內容基本梳理完畢。對於乙個程式的產生、執行和結束的整個過程,也可以說已經有乙個十分清晰連貫的理解和感受。

再用圖示例下:

這個圖基本涵蓋了乙個程式的過程以及執行的環境。所以,最後就用這個圖結束這系列的整理咯。

mysql vc執行庫 VC 執行庫安裝

vc 執行庫 visual c 可再發行程式包 是執行使用相應版本的 visual c 開發的應用程式時必要的元件。wampserver內建的apache mysql mariadb和php就依賴vc 執行庫,所以我們需要在電腦上安裝好vc 執行庫,否則無法正常使用wampserver。wampse...

庫與執行庫 記憶體

一.棧 棧儲存了乙個函式呼叫所需要的維護資訊,稱為堆疊幀或活動記錄,包含的內容 乙個函式的活動記錄用ebp和esp兩個暫存器劃定範圍。esp暫存器始終指向棧的頂部,同時也就指向了當前函式的活動記錄的頂部。而ebp暫存器指向了函式活動記錄的乙個固定位置,ebp暫存器又被稱為棧指標,ebp指向的資料是呼...

執行庫實現

堆的實現 io與檔案操作 字串相關操作 格式化字串 helloworld程式無須用到的功能就不實現,比如異常 盡量簡化設計,盡量符合c 標準庫的規範 對於可以直接在標頭檔案實現的模組盡量在標頭檔案中實現,以免諸多的類 函式的宣告和定義造成 量膨脹,不便於演示 執行庫 要做到可以在windows和li...