ELF檔案格式

2021-09-27 13:45:04 字數 4173 閱讀 1825

準備用來生成可重定位目標檔案的 c 語言**

#include

int global =0;

intsum

(int a,

int b)

;int

main()

intsum

(int a,

int b)

生成可重定位目標檔案

gcc -c main.c -o main.o

使用 readelf 指令閱讀

readelf -a main.o

elf 標頭檔案包含幫助聯結器語法分析和解釋目標檔案的資訊, 包括大小, 型別, 機器型別, 檔案便宜, 節頭部表的檔案偏移, 條目大小和數量.

elf header:

magic:

7f45

4c 46

0201

0100

0000

0000

0000

0000

class: elf64

data:

2's complement, little endian

version:

1(current)

os/abi: unix - system v

abi version:

0 type: rel (relocatable file)

machine: advanced micro devices x86-

64 version:

0x1 entry point address:

0x0 start of program headers:

0(bytes into file)

start of section headers:

968(bytes into file)

flags:

0x0 size of this header:

64(bytes)

size of program headers:

0(bytes)

number of program headers:

0 size of section headers:

64(bytes)

number of section headers:

13 section header string table index:

12

section headers: 節頭

列出了每個節的 名字, 型別, 位址, 偏移, 大小等等

section headers:

[nr] name type address offset

size entsize flags link info align

[0]null

0000000000000000

00000000

0000000000000000

000000000000000000

0[1]

.text progbits 0000000000000000

00000040

000000000000005c 0000000000000000 ax 001

[2].rela.text rela 0000000000000000

000002b8

0000000000000078

0000000000000018 i 1018

[3].data progbits 0000000000000000

0000009c

0000000000000000

0000000000000000 wa 001

[4].bss nobits 0000000000000000

0000009c

0000000000000004

0000000000000000 wa 004

[5].rodata progbits 0000000000000000

0000009c

0000000000000010

0000000000000000 a 001

[6].comment progbits 0000000000000000

000000ac

0000000000000025

0000000000000001 ms 001

[7].note.gnu-stack progbits 0000000000000000

000000d1

0000000000000000

000000000000000000

1[8]

.eh_frame progbits 0000000000000000

000000d8

0000000000000058

0000000000000000 a 008

[9].rela.eh_frame rela 0000000000000000

00000330

0000000000000030

0000000000000018 i 1088

[10].symtab symtab 0000000000000000

00000130

0000000000000150

0000000000000018119

8[11]

.strtab strtab 0000000000000000

00000280

0000000000000035

000000000000000000

1[12]

.shstrtab strtab 0000000000000000

00000360

0000000000000061

000000000000000000

1

.text 儲存**

.rodata 唯讀資料, 比如格式串, 跳轉表等

.data 全域性和靜態c變數

.bss 未初始化的全域性和靜態變數, 相比 .data 可以節省空間

.symtab 符號表: 全域性變數, 函式

.rel.text

呼叫外部函式或者引用全域性變數需要修改這個位置

.rel.data

被模組引用或者定義的所有全域性變數的重定位資訊

.debug

除錯符號表

.line 行號和 .text節機器指令之間的對映.

.strtab

字串表

檢視唯讀資料

objdump -s -j .rodata main.o

main.o:     file format elf64-x86-

64contents of section .rodata:

0000

25640a00 48656c6c 6f

20576f

726c6400 %d.

.hello world.

檢視所有的符號

nm -g main.o

0000000000000000 b global

u _global_offset_table_

0000000000000000 t main

u printf

0000000000000048 t sum

可以看到這裡列出了全域性變數 global 和函式 main, printf 和 sum

ELF檔案格式

在介紹elf格式之前,先簡單說明一下可執行檔案的生成流程 1 編寫c原始檔,或彙編原始檔 2 準備共享庫格式的目標檔案 shared object file 如數學庫 標準庫 2 用編譯器 compiler 將c編譯成可重定位格式的目標檔案 relocatable object file 用彙編器 ...

ELF檔案格式

1.目標檔案 編譯器和彙編器生成可重定位目標檔案 包括共享目標檔案 鏈結器生成可執行目標檔案。2.可重定位目標檔案和可執行目標檔案的格式 可重定位目標檔案格式 可執行目標檔案格式 3.下面我們開始分析上面 而對於未被初始化的全域性變數和靜態區域性變數,編譯的時候並未被分配空間,而是僅僅在.bss段中...

ELF檔案格式

elf指executable and linking format,不僅包含可執行檔案,也包含庫檔案,包括靜態庫和動態庫。準備的說,也就是三種 這不廢話嗎 可執行檔案 靜態鏈結庫 動態鏈結庫 要觀察elf的具體資訊,可以用以下幾個工具 nm lists symbols from object fil...