Linux

ELF 執行檔的哪些部分被載入到記憶體中,在哪裡?

  • March 30, 2013

我已經知道的:

ELF 執行檔有許多節,顯然 .text 和 .data 節被載入到記憶體中,因為它們是程序的主要部分。但是要使程序正常工作,它需要更多資訊,尤其是在動態連結時。

我感興趣的是 .plt、.got、.dynamic、.dynsym、.dynstr 等部分。ELF 中負責將函式連結到地址的部分。

到目前為止,我已經能夠弄清楚,像 .symtab 和 .strtab 這樣的東西不會被載入(或不留在)記憶體中。但是連結器使用 .dynsym 和 .dynstr 嗎?它們會留在記憶中嗎?我可以從程式碼中訪問它們嗎?

執行檔的任何部分是否駐留在核心記憶體中?

我對此的興趣主要是取證,但有關此主題的任何資訊都會有所幫助。我讀過的關於這些表和動態連結的資源更高級,它們只解釋了工作原理,對記憶體中的內容沒有任何實際意義。

如果對我的問題有任何不清楚的地方,請告訴我。

以下是一個非常好的參考:http ://www.ibm.com/developerworks/linux/library/l-dynamic-libraries/ 。它在不同級別的各種不同參考文獻的末尾包含一個參考書目。如果你想知道每一個血淋淋的細節,你可以直接去源頭:http ://www.akkadia.org/drepper/dsohowto.pdf 。(Ulrich Drepper 編寫了 Linux 動態連結器。)

通過執行“objdump -h myexe”或“readelf -S myexe”之類的命令,您可以很好地了解執行檔中的所有部分。

.interp 部分包含將用於動態連結此對像中的符號的動態載入器的名稱。.dynamic 部分是程序頭的提煉,其格式被格式化為便於動態載入器讀取。(所以它有指向所有其他部分的指針。)

.got(全域偏移表)和 .plt(過程連結表)是動態連結器操作的兩個主要結構。.got 是變數的間接表,.plt 是函式的間接表。每個執行檔或庫(稱為“共享對象”)都有自己的 .got 和 .plt ,這些是由該共享對象引用的符號表,實際上包含在某個其他共享對像中。

.dynsyn 包含有關共享對像中符號的所有資訊(您定義的符號和需要引用的外部符號)。.dynsyn 不包含實際的符號名稱。這些包含在 .dynstr 中,並且 .dynsyn 具有指向 .dynstr 的指針。.gnu.hash 是一個雜湊表,用於按名稱快速查找符號。它還只包含指針(指向 .dynstr 的指針,以及用於製作桶鏈的指針。)

當您的共享對象取消引用某個符號“foo”時,動態連結器必須在您連結的所有動態對像中查找“foo”,以確定哪個包含您正在尋找的“foo”(然後是相對的“foo”的地址在該共享對象內。)動態連結器通過搜尋所有連結共享對象的 .gnu.hash 部分(或 .hash 部分以查找沒有 .gnu 的舊共享對象)來執行此操作。 hash 部分。)一旦在連結的共享對像中找到正確的地址,它就會將其放入共享對象的 .got 或 .plt 中。

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