Executable

我可以在目標文件中創建多少個部分?

  • June 4, 2014

我正在學習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

來源:http ://wiki.osdev.org/ELF

其他來源(例如 Wikipedia)也僅顯示最基本的部分名稱,使您相信這些都是允許的。額外的搜尋顯示也有這兩個部分:

.fini

本節包含有助於程序終止程式碼的可執行指令。即當程序正常退出時,系統會安排執行本節中的程式碼。

。在裡面

本節包含有助於程序初始化程式碼的可執行指令。也就是說,當程序開始執行時,系統會安排在主程序入口點(在 C 程序中稱為 main)之前執行本節中的程式碼。

和部分.init.fini特殊用途。如果一個函式被放置在.initsection中,系統會在main函式之前執行它。此外,放在該.fini節中的函式將在主函式返回後由系統執行。編譯器利用此功能在 C++ 中實現全域建構子和解構子。

來源: http: //l4u-00.jinr.ru/usoft/WWW/www_debian.org/Documentation/elf/node3.html

但是,是的,你可以有任何部分

但是感謝@AProgrammer將我指向實際的ELF Specification v1.2,第 1-16 頁上有一段說明如下:

帶有點 (.) 前綴的節名是為系統保留的,但如果它們的現有含義令人滿意,應用程序可以使用這些節。應用程序可以使用不帶前綴的名稱以避免與系統部分衝突。目標文件格式允許定義不在上面列表中的部分。一個目標文件可能有多個同名的部分。

所以看起來它完全取決於程序想要使用哪些部分。

引用自:https://unix.stackexchange.com/questions/134418