2012-03-13 253 views
0

我想程序化地獲取__data_start符號的地址。對於_GLOBAL_OFFSET_TABLE_,使用extern void* _GLOBAL_OFFSET_TABLE_工作(請參閱示例here)。但是,相同的技術對__data_start不起作用。雖然編譯器編譯的程序正常,但程序返回的值是假的。任何想法如何解決這個問題。獲取__data_start符號的地址

+2

它沒有工作;看到我對你的其他問題的評論。並將'__data_start'改爲'&__ data_start'。 – 2012-03-13 17:30:36

+0

@R ..太好了!它的作品現在!謝謝!也許你可以把這個作爲答案,所以我可以接受它。 – MetallicPriest 2012-03-13 17:37:41

回答

3

__data_start這樣的魔術符號不是指針變量,其值就是你想要的地址。這是你想要的符號的地址。所以你需要&運算符,如&__data_start

+0

「__data_start」定義在哪裏?不像'etext',它不在'ld -verbose'給出的鏈接器腳本上。但它肯定是鏈接器,它定義爲它出現在'ld'的源頭上。其他一些鏈接器腳本安裝定義'__data_start__',但不是'__data_start'。 – 2015-05-31 23:20:35

+0

其實我不知道。你必須檢查鏈接源來弄清楚,或者詢問是GNU ld專家的人。 – 2015-06-01 02:09:07

+0

當然,以防萬一它很明顯:-)如果我發現我會回來。 – 2015-06-01 07:31:36

1

你可以嘗試

extern char _GLOBAL_OFFSET_TABLE_[]; 
extern char __data_start[]; 

(數組是聲明的不是指針,!)

,並在代碼中使用&__data_start

+0

在這種情況下,'&'不是必需的,因爲數組的名稱計算爲指向其第一個元素的指針。 – 2012-03-13 22:55:19

+0

同意。但對可讀性可能有用。 – 2012-03-14 06:05:52

+0

對於用不完整類型(未知大小)聲明的數組,是否'&'甚至有效?通常,應用於'T [N]'類型數組的'&'類型的類型是'T(*)[N]',但這裏不存在'N' ... – 2012-03-14 23:55:49

1

此代碼完全沒有問題。

extern void *data_start; 
int main() { 
fprintf(stdout,">%p\n", &data_start); 
return 0; 
} 

atom :: » nm test | grep "data_start" ; ./test 
0804a00c D __data_start 
0804a00c W data_start 
>0x804a00 
+0

我不確定它是否正常工作。看到我的答案。 – 2012-03-13 19:04:38