本篇簡單介紹下執行庫,並總結下乙個程式的最終執行環境。
作業系統裝載程式之後,並不是馬上從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...