鏈結器將多個可重定位目標檔案合併成可執行目標檔案,可執行目標檔案格式同可重定位目標檔案的格式大致相似。elf頭部描述檔案的總體資訊。它還包括程式的入口點(entry point) 。它指向程式執行時第一條指令的位址。.text .data .rodata各部分節都被重定位到執行時記憶體位址。
其中包含乙個 .init節 其定義了乙個小函式,程式的初始化**會將其呼叫。另外,可執行檔案是完全鏈結的(符號均已經被重定位),所以它不需要.rel 節。
objdump -h main 通過objdump檢視main可執行檔案的內容格式
可以看到同可重定位目標檔案類似,可執行目標檔案主要由各部分節組成:
可以看到 多個模組的.data .text等節 被合併在一起,體現在可執行檔案中它們都進行了組合(相鄰)。
【載入可執行目標檔案】
通過linux shell 直接執行即:
linux> ./main
因為main不是乙個內建的shell命令,所以shell 認為main是乙個可執行的目標檔案,也就是通過呼叫核心的載入器(loader)來執行它。載入器將可執行目標檔案的**和資料從磁碟複製到記憶體中,並跳轉到程式的第一條指令處。
各個區域分別為:
唯讀**段:即對應目標檔案的.text 二進位制**節、.rodata 唯讀資料段 、.init 程式初始化函式
讀寫段:也稱資料段,對應於原始檔中全域性變數(靜態變數)
程式計數器:pc指向當前程式的執行位置。
使用者棧的最大合法位址為2的48次方-1 從2的48次方開始,為核心區域的**和資料。
核心:作業系統常駐記憶體的部分。
linux 動態鏈結庫載入
linux 動態鏈結 linux 中的應用程式以以下兩種方式之一鏈結到外部函式 要麼在構建時與靜態庫 lib a 靜態地鏈結,並且將庫 包含在該應用程式的可執行檔案裡 要麼在執行時與共享庫 lib so 動態地鏈結。通過動態鏈結裝入器,將動態庫對映進應用程式的可執行記憶體中。在啟動應用程式之前,動態...
動態鏈結 執行時載入dlopen
前面我們在編譯可執行檔案時,如果可執行檔案要依賴某個so。必須要通過 l指定so路徑,並且 l指定so名字。而且在可執行檔案執行時,要先載入so的load部分到程序位址空間。有一種方式可以在編譯時不需要link so,而且程式執行過程中去載入so。dlopen函式可以在程序執行過程中,開啟so,將其...
JS執行與頁面載入
我是在csdn的技術問答中看到 js中有沒有jquery.ready這樣的方法 這個問題後,再看到兩篇不錯的文章 深入分析jquery的ready函式是如何工作的 工作原理 jquery document ready 與window.onload的區別 js中定義的事件 window.onload或...