ELF格式可重定位目標檔案

2021-09-27 16:15:45 字數 1715 閱讀 5731

乙個典型的elf格式的可重定位目標檔案以elf頭開始,還包括**區、資料區,以下是具體形式:

elf頭

.text(已編譯程式的機器**)

.rodata(唯讀資料)

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

.bss(未初始化的全域性和靜態c變數,初始化為0的全域性或靜態變數)

.symtab(符號表)

.rel.text(.text節的位置列表)

.rel.data(全域性變數的重定位資訊)

.debug(除錯符號表)

.line(c源程式與.text指令之間的對映)

.strtab(字串表)

節頭部表

對於以下原始檔名為symbols.c的以下**

#include

int time;

intfoo

(int a)

intmain

(int argc,

char

*ar**)

在命令列輸入:gcc -c symbols.c得到可重定位目標檔案symbols.o

命令列輸入readelf -h symbols.o

而elf頭中存放的是用來描述整個程式的基本資訊

包括機器型別;作業系統版本;節頭部表的開始位置、大小;檔案大小等等

比如說type項的值是rel,表示她是乙個可重定位目標檔案

命令列輸入readelf -s symbols.o

(-s即section,檢視檔案各個節的基本資訊)

從中我們可以看到對於每乙個條目(節)給出了name、type、address、offset、size、 entsize、flags、link、info、align 一共10個基本資訊

例如,對於.text節來說,它的索引值(ndx)是1:

type值是progbits,表示是二進位制目標檔案

首先介紹符號的概念:簡單來說c語言程式中符號包括函式名凡是有全域性或者static屬性的變數名,即包括

再輸入 readelf -s symbols.o得以檢視以下資料:

(-s即symbols,檢視檔案內部符號表)

對於每乙個條目的不同屬性的說明:

value:偏移量

size:大小(位元組數)

type:型別

bind:繫結屬性——是全域性符號還是本地(區域性)符號

ndx:節索引

vis:

name:符號名稱

圖中前9個是屬於鏈結器內部使用的符號,其中symbols.c指向c語言源程式,故屬於不可重定位的符號,在目標檔案中也沒有實體,所以索引型別為abs型別

再例如12號「main」這個符號:func表示是函式型別,global表示全域性型別,1表示節索引為1,即在.text節中

ELF可重定位目標檔案格式

現在我們用乙個簡單的c語言程式addvec.c做示範,如下 int addvec 0p void addvec int x,int y,int z,int z int i addvec for i 0 i開啟終端,輸入指令 不同節的位置和大小是由節頭部表的描述的,其中目標檔案中每個節都有乙個固定大小...

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

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

可重定位目標檔案

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