2017-05-03 85 views
3

我正在使用Linux X86_64。查找PLT存根地址

我需要確定ELF文件中特定PLT條目的地址,給定條目所代表的動態函數的名稱。 我可以找出地址的文件偏移量,但我需要能夠確定地址。

如果我使用objdump -D -z elffile反彙編ELF文件,我發現objdump爲PLT中的每個條目使用了符號名稱。 (哪裏objdump的這些地址和符號名稱之間的關係?)

例如:

0000000000000041a2b0 [email protected]: 

如果我使用objdump -T elffile | grep fileno我得到的是這樣的:

0000000000000 DF *UND* 00000000000000000 GLIBC_2.2.5 fileno 

我需要什麼能夠從「C」做到的是在ELF文件中找到特定動態函數的PLT條目並獲取地址。

背景是我正在修補現有的ELF文件,並且需要將函數調用重定向到不同的動態函數。我已經使用從objdump反彙編收集的地址手動修補了一個ELF文件,並證明這將適用於我的特定應用程序,我只需要能夠從程序中完成。我希望不需要通過objdump反彙編程序代碼來找出它是如何獲取PLT條目符號和地址的。

回答

1

我想通了: 你必須解析rela.plt部分中的重定位表。 這些條目包含一個字符串表索引,可用於通過索引到動態符號部分來查找函數名稱。動態符號部分中的每個條目都包含可用於提取函數名稱的動態字符串表偏移量。找到相應的函數時,重定位表(+1)中的索引對應於函數PLT條目的.plt節中的索引。因此,要計算特定條目的地址,它只是:.plt.sec地址+(((relocation_index + 1)* .plt條目大小)

此方法適用於x86。 它不適用於.plc部分具有完全不同格式的PPC。如果任何人有任何關於PPC的信息,請發佈。

+0

對於i386的說明,未正確報告PLT條目大小。您可以將報告的plt條目大小乘以4,也可以使用16來表示條目大小。 – codemonkey