程式**如下:(最簡單的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 包含重定位資訊 指出哪些符號引用處需要重定位...