可重定位目標檔案解析

2021-09-29 05:18:04 字數 1385 閱讀 4979

程式**如下:(最簡單的hello.c)

#include

intmain()

我們首先生成可重定位目標檔案

gcc -c  hello.c
這是有關可重定位目標檔案的結構圖(從mooc ppt上所截)

計算機系統基礎(一)第十周第三講

讓我們看一下elf的檔案大體的資訊

選取幾個解釋一下

type:rel (可重定位檔案) 可以看出.o檔案的型別為可重定位檔案;

number of program headers:0 可以看出可重定位檔案的program header table的長度為0。因為在可重定位檔案裡不需要program header table;

本頭的大小:52:elf檔案頭大小為52 byte。

再看看elf檔案各部分,即看看各個節

共有13個節頭

各個節的具體內容如下:

.text:儲存了可執行**經過編譯的機器**。

.data和.bss:.data存放已初始化的全域性和靜態c變數, .bss存放未初始化的全域性和靜態c變數和初始化為0的全域性和靜態c變數。僅僅是佔位符,不佔任何實際磁碟空間,區分初始化和非初始化是為了提高空間效率。

.rodata:存放唯讀資料,如printf格式串、switch跳轉表等,在該程式中佔據0xd個位元組的空間,存放的就是**中唯一的乙個需要儲存到.rodata段的字串常量」hello world!」。

.commont:存放gcc版本資訊;

.strtab:指的是原c檔案中的檔名和函式名等資訊;

.shstrtab:指的是section header string table,其中儲存了各個節的名字;

.symtab:存放函式和全域性變數(符號表)資訊。

在我們的hello.o中,其.symtab的內容如下:

ndx:指示所在節索引數,即在那個節。其中und為未定義,abs為不用重定位。

bind:為本地or全域性

type:節、檔案、函式等

可重定位目標檔案

目標檔案有三種形式 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...

04可重定位目標檔案ELF檔案解析

目錄 一 可重定位目標檔案的特點 二 可重定位目標檔案的格式 可被鏈結 合併 生成可執行檔案或共享目標檔案 靜態鏈結庫檔案由若干個可重定位目標檔案組成 包含 資料 已初始化全域性變數和區域性靜態變數.data和未初始化的全域性變數和區域性靜態變數.bss 包含重定位資訊 指出哪些符號引用處需要重定位...