我想程序化地獲取__data_start
符號的地址。對於_GLOBAL_OFFSET_TABLE_,使用extern void* _GLOBAL_OFFSET_TABLE_
工作(請參閱示例here)。但是,相同的技術對__data_start
不起作用。雖然編譯器編譯的程序正常,但程序返回的值是假的。任何想法如何解決這個問題。獲取__data_start符號的地址
回答
像__data_start
這樣的魔術符號不是指針變量,其值就是你想要的地址。這是你想要的符號的地址。所以你需要&
運算符,如&__data_start
。
「__data_start」定義在哪裏?不像'etext',它不在'ld -verbose'給出的鏈接器腳本上。但它肯定是鏈接器,它定義爲它出現在'ld'的源頭上。其他一些鏈接器腳本安裝定義'__data_start__',但不是'__data_start'。 – 2015-05-31 23:20:35
其實我不知道。你必須檢查鏈接源來弄清楚,或者詢問是GNU ld專家的人。 – 2015-06-01 02:09:07
當然,以防萬一它很明顯:-)如果我發現我會回來。 – 2015-06-01 07:31:36
你可以嘗試
extern char _GLOBAL_OFFSET_TABLE_[];
extern char __data_start[];
(數組是聲明的不是指針,!)
,並在代碼中使用&__data_start
。
在這種情況下,'&'不是必需的,因爲數組的名稱計算爲指向其第一個元素的指針。 – 2012-03-13 22:55:19
同意。但對可讀性可能有用。 – 2012-03-14 06:05:52
對於用不完整類型(未知大小)聲明的數組,是否'&'甚至有效?通常,應用於'T [N]'類型數組的'&'類型的類型是'T(*)[N]',但這裏不存在'N' ... – 2012-03-14 23:55:49
此代碼完全沒有問題。
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
我不確定它是否正常工作。看到我的答案。 – 2012-03-13 19:04:38
- 1. Django:使用信號獲取IP地址
- 2. 從地址boook獲取號碼
- 3. 將符號地址複製到符號
- 4. 如何用'+'符號獲取地址欄值?
- 5. 地址中()中獲取價值從符號表
- 6. 如何從地址獲取字符串?
- 7. 如何從地址獲取字符串?
- 8. 從字符串獲取完整地址
- 9. 獲取MAC地址
- 10. 獲取.lib地址
- 11. 獲取IP地址
- 12. 獲取IP地址
- 13. 獲取IP地址
- 14. 獲取本地IP地址
- 15. Google Maps API - 獲取地址到地址
- 16. 獲得同時使用方括號和符號地址
- 17. 獲取ip地址的值
- 18. 獲取我的IP地址
- 19. 符號的電子郵件地址(HREF)
- 20. dlsym()返回符號的奇怪地址
- 21. 使用inet_pton()來獲取IPv4地址的無符號整型表示
- 22. 獲取用戶的地理地址
- 23. 獲取指針字符指針的地址字符指針
- 24. 獲取本地地址而不是IP地址的WebService
- 25. 獲取產生UNIX信號的故障地址
- 26. 獲取由信號SIGSEGV(地址邊界錯誤)終止的「./a.out」
- 27. 如何獲取數據庫IP地址,oracle中的端口號?
- 28. Facebook API - 如何獲取用戶的地址,電話號碼?
- 29. 在vb.net獲取IP地址
- 30. 獲取多個MAC地址
它沒有工作;看到我對你的其他問題的評論。並將'__data_start'改爲'&__ data_start'。 – 2012-03-13 17:30:36
@R ..太好了!它的作品現在!謝謝!也許你可以把這個作爲答案,所以我可以接受它。 – MetallicPriest 2012-03-13 17:37:41