簡體   English   中英

linux進程中的多個全局偏移表

[英]Multiple global offset tables in linux process

我正在檢查正在運行的進程的內存布局並進行了有趣的觀察。 似乎有多個 GOT(全局偏移表)。 這是我在研究 malloc 函數時在調試器中看到的:

(gdb) p (void *) 0x7ff5806ae020
$5 = (void *) 0x7ff5806ae020 <malloc@got.plt>
(gdb) p (void *) 0x7ff5806471d0
$6 = (void *) 0x7ff5806471d0 <malloc@got.plt>
(gdb) p (void *) 0x5634ef446030
$7 = (void *) 0x5634ef446030 <malloc@got.plt>

我檢查了malloc蹦床的 3 個不同地址。 當我查看進程的內存映射時,這些地址對應於以下條目:

7ff580647000-7ff580648000 rw-p 0001c000 fd:01 547076                     /lib/x86_64-linux-gnu/libpthread-2.31.so
5634ef446000-5634ef447000 rw-p 00003000 fd:02 12248955                   /home/user/binary
7ff5806ae000-7ff5806af000 rw-p 0002a000 fd:01 523810                     /lib/x86_64-linux-gnu/ld-2.31.so

我看到不同的條目對應於不同的“可鏈接對象”:二進制和兩個動態庫。

此外,三分之二的蹦床指向實際功能。 並且兩個指針是相同的。 第三個蹦床指向存根。

(gdb) p *(void **) 0x5634ef446030
$8 = (void *) 0x7ff5804ef1b0 <__GI___libc_malloc>
(gdb) p *(void **) 0x7ff5806471d0
$9 = (void *) 0x7ff580631396 <malloc@plt+6>
(gdb) p *(void **) 0x7ff5806ae020
$10 = (void *) 0x7ff5804ef1b0 <__GI___libc_malloc>

真的需要三個蹦床嗎? 如果是,那為什么?

我意識到這樣的系統是實現蹦床的唯一明智方法。

在匯編中,對動態鏈接函數的每個調用指令基本上都引用了 GOT 中該函數的索引。 索引直接在指令中編碼。 因此,在靜態鏈接期間必須知道索引是最新的。 否則,程序代碼必須在每次程序啟動時由動態鏈接器更新。 顯然,非常繁瑣的任務。

此外,每個庫都是單獨編譯的,因此不能依賴其他庫,包括它們的確切 GOT 布局。 如果只有一個 GOT,那么所有加載在一起的庫必須以某種方式在 GOT 中每個條目的含義上達成一致。 擁有一個由所有庫一起填充的共享數據結構 (GOT),幾乎肯定會創建這樣的依賴關系。

例如, readelf 說 .so-files 也有表:

$ readelf -S /lib/ld-linux.so.2 
   [18] .got              PROGBITS        00029ff4 028ff4 000008 04  WA  0   0  4
   [19] .got.plt          PROGBITS        0002a000 029000 000028 04  WA  0   0  4
$ readelf -S /usr/lib/libpurple.so.0.13.0
   [21] .got              PROGBITS         0000000000137318  00136318
   0000000000003cd8  0000000000000008  WA       0     0     8

雖然, libpurple 沒有.got.plt ,我不完全理解。

我的困惑來自一個事實,即該表被稱為“全局”。 與編譯模塊(.o 文件)相比,“全局”一詞實際上意味着該表在可鏈接對象級別是全局的。

其次,我有一種錯覺,即 GOT 指的是可執行應用程序,而不是任何可動態鏈接的對象。

暫無
暫無

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

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