Executable
我可以在目標文件中創建多少個部分?
我正在學習Baking Pi – 作業系統開發課程。他們在其中創建了另一個部分
.init
。那麼我們可以根據需要創建盡可能多的部分(不僅僅是
.data, .bss, .text
),我們可以將程式碼和數據(初始化為 no)放入其中嗎?如果是這樣,那麼部分的目的是什麼?
初步研究
乍一看,答案似乎是“否”,ELF 的規範只允許以下部分。
C32/kernel/bin/.process.o architecture: i386, flags 0x00000011: HAS_RELOC, HAS_SYMS start address 0x00000000 Sections: Idx Name Size VMA LMA File off Algn 0 .text 00000333 00000000 00000000 00000040 2**4 CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE 1 .data 00000050 00000000 00000000 00000380 2**5 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000000 00000000 00000000 000003d0 2**2 ALLOC 3 .note 00000014 00000000 00000000 000003d0 2**0 CONTENTS, READONLY 4 .stab 000020e8 00000000 00000000 000003e4 2**2 CONTENTS, RELOC, READONLY, DEBUGGING 5 .stabstr 00008f17 00000000 00000000 000024cc 2**0 CONTENTS, READONLY, DEBUGGING 6 .rodata 000001e4 00000000 00000000 0000b400 2**5 CONTENTS, ALLOC, LOAD, READONLY, DATA 7 .comment 00000023 00000000 00000000 0000b5e4 2**0 CONTENTS, READONLY
其他來源(例如 Wikipedia)也僅顯示最基本的部分名稱,使您相信這些都是允許的。額外的搜尋顯示也有這兩個部分:
.fini
本節包含有助於程序終止程式碼的可執行指令。即當程序正常退出時,系統會安排執行本節中的程式碼。
。在裡面
本節包含有助於程序初始化程式碼的可執行指令。也就是說,當程序開始執行時,系統會安排在主程序入口點(在 C 程序中稱為 main)之前執行本節中的程式碼。
和部分
.init
有.fini
特殊用途。如果一個函式被放置在.init
section中,系統會在main函式之前執行它。此外,放在該.fini
節中的函式將在主函式返回後由系統執行。編譯器利用此功能在 C++ 中實現全域建構子和解構子。來源: http: //l4u-00.jinr.ru/usoft/WWW/www_debian.org/Documentation/elf/node3.html
但是,是的,你可以有任何部分
但是感謝@AProgrammer將我指向實際的ELF Specification v1.2,第 1-16 頁上有一段說明如下:
帶有點 (.) 前綴的節名是為系統保留的,但如果它們的現有含義令人滿意,應用程序可以使用這些節。應用程序可以使用不帶前綴的名稱以避免與系統部分衝突。目標文件格式允許定義不在上面列表中的部分。一個目標文件可能有多個同名的部分。
所以看起來它完全取決於程序想要使用哪些部分。