[英]program headers and section headers in ELF files
這是一個問題的重復,但是我無法快速找到問題的答案。 這就是為什么要問它。
某些ELF文件包含(可執行文件或共享庫)程序標頭,這些標頭解釋了段。 它們包含一個稱為虛擬地址和文件偏移量的字段以及一些其他字段。
也有相應的部分說明“內存中的地址”和文件偏移量。
現在,我對部分和段之間的關系有點困惑。 (對於靜態編譯的可執行文件和非靜態編譯的可執行文件。)對於靜態編譯的二進制文件,文件偏移量有何不同? 程序頭中的虛擬地址與節頭中的內存地址之間是否有任何關系。
謝謝
區段是文件的最小連續區域。 因此,ELF文件可細分為多個部分。 節不能重疊,也就是說,任何字節都不能是一個以上節的一部分。 但是可能存在不屬於任何節的字節(“垃圾”)。
節通常用於鏈接目的。 它們包含文件的不同部分,鏈接器可以重新排列,合並等。
但是可執行文件也可以包含部分,以描述文件的內容以及每段代碼或數據的起始位置。 共享對象也使用節。 這些包含用於動態鏈接的符號表之類的東西。
ELF文件中包含的所有節均在節標題表中描述,每個節中都有一個條目。
但是為了制作可執行文件,您需要其他一些東西: segment 。 這些告訴加載程序應該將文件的哪些部分加載到內存中以及到哪個地址。 因此,段映射到可執行進程的內存空間。 它們既可以包含代碼也可以包含數據,因此可以將段細分為多個部分以實現此目的。 我想這就是您問題的答案。
可裝載段在程序頭表中描述。
長話短說:
在可執行文件中,您具有細分,可以細分為多個部分。 段被加載到進程的內存中。 各節是可選的,但可以幫助進一步細分各節或描述其內容。 在可重定位模塊(編譯器輸出,.o文件)中,這是另一種方式:需要節 ,因為節描述了文件中的內容並允許鏈接。
不使用物理地址,因此可以將其保留為零,但可以將其設置為相同的地址,以防萬一。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.