初步了解可重定位目標檔案

2021-10-01 06:35:06 字數 2023 閱讀 8350

首先,我們先來了解一下什麼是可重定位目標檔案,如圖:

我們看到,原始檔經過翻譯器處理後形成的** .o **檔案 就是可重定位目標檔案。

目標檔案總共有三種:①共享目標檔案②可執行目標檔案③可重定位目標檔案。

其中,③可重定位目標檔案包含二進位制資料和**,可以在編譯時和其它可重定位目標檔案合併起來,建立乙個可執行目標檔案。如上圖的 ld 將 main.o和sum.o以及一些必要的系統目標檔案組合起來,建立了可執行目標檔案prog。

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

其中,每個「節」的意思是:

①.text :已編譯程式的機器**。

②.rodata :唯讀資料。

③.data :已初始化的全域性和靜態c變數

④.bss :未初始化的全域性和靜態c變數

⑤.symtab :乙個符號表,存放在程式中定義和引用的函式和全域性變數的資訊,不包含局 部變數的條目。

⑥.rel .text :乙個 .text節中位置的列表。

⑦.rel .data :被模組引用或定義的所有全域性變數的重定位資訊。

⑧.debug :除錯符號表。

⑨.line :原始c源程式中的行號和 .text節中機器指令之間的對映。

⑩.strtab :乙個字串表,內容包括 .symtab 和debug節中的符號表。

而「節頭部表」包含每個節的節名、偏移和大小。

cmu上此章節的main.c和sum.c原始碼如下:

我們要獲取他們的.o檔案的話(可在包含原始檔的資料夾裡看到),只用輸入如下指令即可:

✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂✂

若是還想看看它們的elf頭部資訊,只需輸入如下指令即可:

在上面,我們列出了典型的elf可重定位目標檔案的格式,如果想檢視具體的「節」的資訊,只要輸入如下指令即可:

(大寫s,.o檔案)

若是想檢視.o檔案的符號表資訊,只要輸入如下指令即可:

(小寫s,.o檔案)

readelf一般用於檢視elf格式的檔案資訊

而指令man可以檢視其它指令的引數,就像一本工具書一樣。並且man有固定的輸出格式:

name              命令名稱及功能簡要說明

synopsis   用法說明,包括可用的選項

description 命令功能的詳細說明,可能包括每乙個選項的意義

options 說明每一項的意義

files 此命令相關的配置檔案

bugs

examples 使用示例

see also 另外參照

可重定位目標檔案

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

可重定位目標檔案

可重定位目標檔案經由源程式預處理,編譯,彙編之後得到的檔案。其中包括不可讀的二進位制 擴充套件名為.o。現有兩個模組的 main.c int sum int a,int n int array 2 int main sum.c int sum int a,int n return s 一.在linu...

7 4 可重定位目標檔案

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