elf格式與bss段
linux下目標檔案的bss段、資料段、**段
elf(executable linkable format)是linux系統下的一種可執行可鏈結檔案的格式,是coff格式的變種。在linux系統中包括了可重定位檔案(.o檔案),可執行檔案(/bin/bash檔案),共享目標檔案(.so)和核心轉儲檔案(core dump)。
elf檔案頭(elf header):位於elf檔案的頭部,包含了描述整個檔案的基本屬性。
**段(.text):用於存放程式**,唯讀屬性
資料段(.data):用於存放程式中經初始化的全域性變數和靜態區域性變數,讀寫屬性
bss段(.bss)(block started by symbol):用於存放程式中未經初始化的全域性變數和靜態區域性變數。在目標檔案中,這個段並不佔據實際空間,它僅僅只是乙個佔位符。
// test1.c
int a = 1;
static
int b = 4;
int c;
static
int d;
char *s1 = "1234";
int main()
編譯檔案
gcc test1.c -o test1.o
檢視編譯後檔案的資訊
objdump -sx test1.o
sections:
idx name size vma lma file off algn
14.rodata
0000000e 0000000000400550
0000000000400550
00000550
2**2
contents, alloc, load, readonly, data
23.data
00000020
00000000006008a8 00000000006008a8 000008a8 2**3
contents, alloc, load, data
24.bss
00000010
00000000006008c8 00000000006008c8 000008c8 2**2
alloc
sections展示了不同的段的大小。
symbol
table:
00000000006008bc l o .data 0000000000000004 b
00000000006008cc l o .bss 0000000000000004 d
00000000006008c0 g o .data 0000000000000008 s1
00000000006008d0 g o .bss 0000000000000004 c
00000000006008b8 g o .data 0000000000000004 a
symbol table展示了不同的變數是存在哪的。這裡就可以看到
data段有:
而bss段有:
contents of section .rodata:
400550
01000200
31323334
00333435
3600
....1234
.3456
. contents of section .
data:
6008a8 00000000
00000000
00000000
00000000
......
......
....
6008b8 01000000
04000000
54054000
00000000
......
..t.@...
..
可以看到rodata段中有我們定義的1234和3456
而data段裡有1和4(小端)分別對應a和b
還可以讀取elf檔案,命令是readelf
ELF格式與bss段
elf executable linkable format 是linux系統下的一種可執行可鏈結檔案的格式,是coff格式的變種。在linux系統中包括了可重定位檔案 o檔案 可執行檔案 bin bash檔案 共享目標檔案 so 和核心轉儲檔案 core dump elf檔案頭 elf heade...
ELF格式與bss段
elf executable linkable format 是linux系統下的一種可執行可鏈結檔案的格式,是coff格式的變種。在linux系統中包括了可重定位檔案 o檔案 可執行檔案 bin bash檔案 共享目標檔案 so 和核心轉儲檔案 core dump elf檔案頭 elf heade...
elf檔案格式學習
elf 檔案格式學習 文章出處 結合例項解讀 elf檔案 閱讀筆記 bkbll bkbll cnhonker.net,kbll tom.com 自unix 系統實驗室 usl 開發和發布了 executable and linking format elf 這樣的二進位制格式以後,在 nix 系統上...