2017-05-18 58 views
1

這適用於可重定位的ELF對象文件,而不是完全鏈接的ELF或ELF共享庫。將符號表中的符號名稱替換爲可重定位的ELF對象文件中的新的更長名稱

目前,如果有一個程序,如:

main.c: 
    int main() { 
     foo(); 
     return 0; 
    } 

編譯GCC -c main.c中 它會生成一個main.o

我想做到的是什麼替代foo與「傻瓜食物」(更長的名稱)AFTER目標文件是已經創建。

因爲目前如果我們伸過

任何瞭解將有助於長度3的重定位ELF將被打破。

謝謝先進。

回答

1

我想要完成的是在對象文件已經創建之後,用「傻瓜或食物」(更長的名稱)替換對foo的調用。

這是很有可能的,但很瑣碎。

首先,您需要將.symtab部分複製到文件的末尾,然後將所需字符串food\0添加到該文件中。其次,如果在上一步中添加的部分,則需要更新部分表格,並將原始.symtab的偏移量和長度替換爲偏移量和大小。

最後,您需要找到符號(在.symtab部分中),並使用第一步中添加的food字符串的偏移量更新其st_name

這就是它的全部。

+1

「這就是全部」 - 高超的輕描淡寫! –

+0

我會嘗試一種類似的方法,讓你(@JonathanLeffler + Employed Russian)知道它是怎麼回事,謝謝你的幫助 – Seoul

+0

@首爾:在一些(大多數?)ELF系統上,有一個帶有函數的'libelf'以方便讀取ELF對象文件。我沒有用過;我不確定它在多大程度上創建了有效的ELF對象文件,但我希望支持在那裏。如果可用,請使用它 - 它會讓您的生活更輕鬆。 (使用Google和'libelf'進行快速搜索可以找到很多有用的URL,並提及'修改'。) –