可重定位目標檔案

2021-09-27 13:38:53 字數 1274 閱讀 7824

可重定位目標檔案經由源程式預處理,編譯,彙編之後得到的檔案。其中包括不可讀的二進位制**,擴充套件名為.o。

現有兩個模組的**

main.c

int sum(int *a,int n);

int array[2]=;

int main()

sum.c

int sum(int *a,int n)

return s;

}一.在linux的終端中,使用gcc -c main.c sun.c命令可得到乙個可重定位目標檔案:

下圖是乙個典型的elf可重定位目標檔案的格式

該可重定位目標檔案主要是由若干節構成的,除了這些節還有兩個重要的部分,乙個是elf頭,另乙個是節頭表。

二. elf頭包含了檔案結構說明資訊。在linux的終端中,使用gcc readelf -h main.o命令就可以看到main.o的elf頭。

elf頭以乙個16個位元組的序列開始,圖中前4個位元組 7f 45 4c 46 通常用來確定檔案的型別或格式,我們稱之為魔數。載入或讀取檔案時,可用魔數確定檔案型別是否正確。

入口點位址是0,因為這是可重定位目標檔案,還沒有鏈結成可執行目標檔案,就還不會進行載入執行。

程式頭偏移量大小為0是因為可重定位目標檔案沒有程式頭表。

三.接著使用gcc readelf -s main.o命令就可以看到main.o的節頭表。

節頭表通常會描述每個節的節名,在檔案中的偏移,大小,訪問屬性,對其方式等。該節頭表中描述了從0到11這12個節的資訊,起始位址為0x224。

其中addr虛擬位址這一字段每一節都是0,因為這不是可執行檔案,不會載入執行,在可重定位目標檔案中,每個可裝入節的起始位址總是0。

offset表示起始位址,size表示節的大小,***表示可執行方式,al表示對齊方式。

如 .text節是從0x34的位址開始的,size是16進製制的31,可裝入記憶體執行,而且是只可執行,對齊方式按1位元組對齊。

可重定位目標檔案

目標檔案有三種形式 1.可重定位目標檔案 2.可執行目標檔案 3.共享目標檔案 編譯器和彙編器生成可重定位目標檔案 共享目標檔案,聯結器生成可執行目標檔案。在這裡我們首先介紹可重定位目標檔案。可重定位目標檔案 包含二進位制 和資料,可以在編譯時與其他可重定位目標檔案合併起來,建立乙個可執行目標檔案。...

7 4 可重定位目標檔案

下圖展示了乙個典型的elf可重定位目標檔案的格式。elf頭 elf header 以乙個16位元組的序列開始,這個序列描述了生成該檔案的系統的字的大小和位元組順序,elf頭剩下的部分包含幫助鏈結器語法分析和解釋目標檔案的資訊。其中包括elf頭的大小,目標檔案的型別 如可重定位,可執行性,或者共享的 ...

可重定位目標檔案解析

程式 如下 最簡單的hello.c include intmain 我們首先生成可重定位目標檔案 gcc c hello.c這是有關可重定位目標檔案的結構圖 從mooc ppt上所截 計算機系統基礎 一 第十周第三講 讓我們看一下elf的檔案大體的資訊 選取幾個解釋一下 type rel 可重定位檔...