準備用來生成可重定位目標檔案的 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...