簡體   English   中英

ELF文件中的程序標題和節標題

[英]program headers and section headers in ELF files

這是一個問題的重復,但是我無法快速找到問題的答案。 這就是為什么要問它。

某些ELF文件包含(可執行文件或共享庫)程序標頭,這些標頭解釋了段。 它們包含一個稱為虛擬地址和文件偏移量的字段以及一些其他字段。

也有相應的部分說明“內存中的地址”和文件偏移量。

現在,我對部分和段之間的關系有點困惑。 (對於靜態編譯的可執行文件和非靜態編譯的可執行文件。)對於靜態編譯的二進制文件,文件偏移量有何不同? 程序頭中的虛擬地址與節頭中的內存地址之間是否有任何關系。

謝謝

區段是文件的最小連續區域。 因此,ELF文件可細分為多個部分。 節不能重疊,也就是說,任何字節都不能是一個以上節的一部分。 但是可能存在不屬於任何節的字節(“垃圾”)。

節通常用於鏈接目的。 它們包含文件的不同部分,鏈接器可以重新排列,合並等。

但是可執行文件也可以包含部分,以描述文件的內容以及每段代碼或數據的起始位置。 共享對象也使用節。 這些包含用於動態鏈接的符號表之類的東西。

ELF文件中包含的所有節均在節標題表中描述,每個節中都有一個條目。

但是為了制作可執行文件,您需要其他一些東西: segment 這些告訴加載程序應該將文件的哪些部分加載到內存中以及到哪個地址。 因此,段映射到可執行進程的內存空間。 它們既可以包含代碼也可以包含數據,因此可以將段細分為多個部分以實現此目的。 我想這就是您問題的答案。

可裝載段在程序頭表中描述。

長話短說:
在可執行文件中,您具有細分,可以細分為多個部分。 段被加載到進程的內存中。 各節是可選的,但可以幫助進一步細分各節或描述其內容。 在可重定位模塊(編譯器輸出,.o文件)中,這是另一種方式:需要 ,因為描述了文件中的內容並允許鏈接。


至於內存地址和東西:
在現代系統上,僅虛擬地址很重要。 操作系統欺騙該進程,使其在內存中單獨運行,而整個地址空間都可用(盡管由於物理內存限制,並非所有地址空間都可以同時可用)。 系統將虛擬地址動態映射到物理地址,這對進程是透明的。

不使用物理地址,因此可以將其保留為零,但可以將其設置為相同的地址,以防萬一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM