程式設計師的自我修養 目標檔案裡有什麼

2021-09-13 13:17:06 字數 4978 閱讀 1101

這一章主要講述目標檔案有哪幾個部分組成以及介紹組成部分。

elf格式檔案有檔案頭和各個段組成。

2.段(section):sections 是在elf檔案裡頭,用以裝載內容資料的最小容器。在elf檔案裡面,每乙個 sections 內都裝載了性質屬性都一樣的內容。例如

1) .text section 裡裝載了可執行**;

2) .data section 裡面裝載了被初始化的資料;

3) .bss section 裡面裝載了未被初始化的資料;

4) 以 .rec 打頭的 sections 裡面裝載了重定位條目;

5) .symtab 或者 .dynsym section 裡面裝載了符號資訊;

6) .strtab 或者 .dynstr section 裡面裝載了字串資訊;

7) 其他還有為滿足不同目的所設定的section,比方滿足除錯的目的、滿足動態鏈結與載入的目的等等。

為什麼要把**段和資料段分開呢,好處有以下兩點

1.可以分開設定屬性。指令區域設定為可讀可執行,資料區域設定成可讀寫。這樣可以防止指令被篡改。

2.提高快取命中率,加快程式執行。現代cpu一般都有資料快取和指令快取。分開存放可以提高快取命中率

3.節約記憶體。系統中執行多個程式的副本,可以共用其中的指令資料和唯讀資料等,只需要再多用些記憶體存放資料區域

可以使用objdump -h列印elf檔案的各個段的基本資訊列印出來。

aston@ubuntu:/home/file/x264$ objdump -h x264

x264: file format elf64-x86-64

sections:

idx name size vma lma file off algn

0 .interp 0000001c 0000000000400238 0000000000400238 00000238 2**0

contents, alloc, load, readonly, data

1 .note.abi-tag 00000020 0000000000400254 0000000000400254 00000254 2**2

contents, alloc, load, readonly, data

2 .note.gnu.build-id 00000024 0000000000400274 0000000000400274 00000274 2**2

contents, alloc, load, readonly, data

3 .gnu.hash 00000e1c 0000000000400298 0000000000400298 00000298 2**3

contents, alloc, load, readonly, data

4 .dynsym 00003c00 00000000004010b8 00000000004010b8 000010b8 2**3

contents, alloc, load, readonly, data

5 .dynstr 000039ab 0000000000404cb8 0000000000404cb8 00004cb8 2**0

contents, alloc, load, readonly, data

6 .gnu.version 00000500 0000000000408664 0000000000408664 00008664 2**1

contents, alloc, load, readonly, data

7 .gnu.version_r 00000160 0000000000408b68 0000000000408b68 00008b68 2**3

contents, alloc, load, readonly, data

8 .rela.dyn 000000c0 0000000000408cc8 0000000000408cc8 00008cc8 2**3

contents, alloc, load, readonly, data

9 .rela.plt 00000b70 0000000000408d88 0000000000408d88 00008d88 2**3

contents, alloc, load, readonly, data

10 .init 0000001a 00000000004098f8 00000000004098f8 000098f8 2**2

contents, alloc, load, readonly, code

11 .plt 000007b0 0000000000409920 0000000000409920 00009920 2**4

contents, alloc, load, readonly, code

12 .plt.got 00000010 000000000040a0d0 000000000040a0d0 0000a0d0 2**3

contents, alloc, load, readonly, code

13 .text 00187b52 000000000040a0e0 000000000040a0e0 0000a0e0 2**4

contents, alloc, load, readonly, code

14 .fini 00000009 0000000000591c34 0000000000591c34 00191c34 2**2

contents, alloc, load, readonly, code

15 .rodata 000264cb 0000000000591c40 0000000000591c40 00191c40 2**5

contents, alloc, load, readonly, data

16 .eh_frame_hdr 0000297c 00000000005b810c 00000000005b810c 001b810c 2**2

contents, alloc, load, readonly, data

17 .eh_frame 00014cfc 00000000005baa88 00000000005baa88 001baa88 2**3

contents, alloc, load, readonly, data

18 .init_array 00000008 00000000007cfa28 00000000007cfa28 001cfa28 2**3

contents, alloc, load, data

19 .fini_array 00000008 00000000007cfa30 00000000007cfa30 001cfa30 2**3

contents, alloc, load, data

20 .jcr 00000008 00000000007cfa38 00000000007cfa38 001cfa38 2**3

contents, alloc, load, data

21 .data.rel.ro 00001330 00000000007cfa40 00000000007cfa40 001cfa40 2**5

contents, alloc, load, data

22 .dynamic 00000240 00000000007d0d70 00000000007d0d70 001d0d70 2**3

contents, alloc, load, data

23 .got 00000040 00000000007d0fb0 00000000007d0fb0 001d0fb0 2**3

contents, alloc, load, data

24 .got.plt 000003e8 00000000007d1000 00000000007d1000 001d1000 2**3

contents, alloc, load, data

25 .data 000019f0 00000000007d1400 00000000007d1400 001d1400 2**5

contents, alloc, load, data

26 .bss 000f9140 00000000007d2e00 00000000007d2e00 001d2df0 2**6

alloc

27 .comment 0000002d 0000000000000000 0000000000000000 001d2df0 2**0

contents, readonly

如果想要看各個段大小可以用size命令

aston@ubuntu:/home/file/x264$ size x264

text data bss dec hex filename

1897775 13216 1020224 2931215 2cba0f x264

3.3.1 **段

可以使用objdump中的-s引數將所有段的內容按16進製制列印出來。-d引數可以將所有包含指令的段反彙編。

3.3.2 資料段和唯讀資料段

.data段儲存的是已經初始化的全域性靜態變數和區域性靜態變數

3.3.3 bss段

bss段存放的是未初始化的全域性變數和區域性靜態變數。.bss不佔據實際的磁碟空間,只在段表中記錄大小,在符號表中記錄符號。當檔案載入執行時,才分配空間以及初始化。有個疑問,我把符號表strip掉了,為什麼程式執行的時候依然知道bss中每個變數的大小?

3.4 其他段

可以使用objcopy把乙個二進位制檔案匯入到**中供其使用

《程式設計師自我修養》閱讀筆記 目標檔案裡有什麼

linux下的目標檔案 o檔案 採用elf格式。目標檔案裡採用段section的格式儲存,比如 段啊 存 資料段啊 初始化了的全域性變數和區域性靜態變數 bss段啊 未初始化的全域性和區域性靜態變數 唯讀資料段啊 程式中用到的字串 等。在所有的段外,有乙個重要的結構叫做檔案頭。所以這裡從檔案頭開始說...

程式設計師的自我修養 目標檔案

1.檔案頭 描述整個檔案的檔案的檔案屬性,包括檔案是否可執 行 是靜態鏈結還是動態鏈結及入口位址 可執行檔案 目標硬體 目標作業系統等資訊,檔案頭還包括乙個段表。段表其實就是乙個描述檔案中各個段的陣列,描述段在檔案中的偏移位置及段的屬性等。2.text段 編譯後執行語句都編譯成機器 儲存在該段。3....

程式設計師的自我修養 3 目標檔案有什麼》

目標檔案的型別 可重定位檔案,可執行檔案,共享目標檔案,核心轉儲檔案。test 儲存的就是程式的 部分,除了資料段,bss段,堆疊段等一般是存放在 段中。data 儲存的是那些已經初始化了的全域性靜態變數和區域性靜態變數。rodata段存放的是唯讀資料,一般是程式裡面的唯讀變數 如const修飾的變...