2015-02-07 95 views
0

測試在32位Linux,x86上進行。如何在編譯ELF二進制文件時設置符號的段號?

假設在我的彙編程序final.s中,我必須加載一些庫符號,例如[email protected]@GLIBC_2.0,並且我想將這些符號加載到固定地址中。

在此question所以下面的說明,我這樣做:

echo ""[email protected]@GLIBC_2.0" = 0x080a7390;" > symbolfile 
echo ""[email protected]_2.0 (4)" = 0x080a7390;" >> symbolfile 
gcc -Wl,--just-symbols=symbolfile final.s -g 

當我檢查符號表的輸出,我得到這個:

readelf -s a.out | grep stdin 
53: 080a7390  4 OBJECT GLOBAL DEFAULT ABS [email protected]@GLIBC_2.0 
17166: 080a7390  0 NOTYPE GLOBAL DEFAULT ABS [email protected]_2.0 (4) 

而且比較常見的ELF biary需要stdin符號:

readelf -s hello.out | grep stdin 

17199: 0838b8c4  4 OBJECT GLOBAL DEFAULT 25 [email protected]@GLIBC_2.0 
52: 0838b8c4  4 OBJECT GLOBAL DEFAULT 25 [email protected]_2.0 (4) 

所以一個明顯的不同我發現的是Ndx列,比如我的固定位置符號的段號是ABS。請檢查參考文獻here

執行a.out時,會拋出segmentation fault錯誤。

所以我的問題是,如何設置符號固定位置的節號?

回答

0

我想加載這些符號在一個固定的地址。

您是將從GLIBC中標識出的這些符號導入。除非你正在做一個完全靜態的鏈接,否則你會得到沒有說這些符號以什麼地址結束。

所以我的問題是,如何設置符號

這個問題的部分數量是沒有意義的:部分數字本身是意義25可參考.bss在一個可執行文件,但到.text在另一個。

你的部分25恰好是.bss這個特殊的系統上,併爲這個特定的構建。嘗試構建一個完全靜態的二進制文件,而您很可能會看到部分24

無論如何,一個正常的可執行文件得到stdinlibc.so.6複製。您將很好地閱讀該流程的this description,並特別注意「額外信貸#2:從可執行文件引用共享庫數據」部分。

但首先理解完全靜態的情況可能會更容易。

+0

嗨,是的,我想要加載/導入這些符號到'.bss'節。我有可能做到嗎? – computereasy 2015-02-07 23:09:48

相關問題