__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'は定義していません。 –
実際、私は考えていません。リンカのソースを調べて調べるか、GNU ldの専門家に尋ねる必要があります。 –
確かに、それは明らかだった:-)私が知っている場合は、私は返信します。 –
あなたは
extern char _GLOBAL_OFFSET_TABLE_[];
extern char __data_start[];
(これは、配列のではなく、ポインタの宣言です!)
を試してみて、あなたのコードで&__data_start
を使用することができます。
この場合、 '&'は必要ではありません。なぜなら、配列の名前が最初の要素へのポインタを評価するからです。 –
合意。しかし、読みやすくするために役立つ可能性があります。 –
不完全な型(未知のサイズ)で宣言された配列に対しても '&'は有効ですか?通常、 'T [N]'型の配列に適用される '&'の型は 'T(*)[N]'型ですが、ここには 'N'はありません... –
このコードは問題なく動作します。
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
私はそれがすべきであると確信していません。私の答えを見てください。 –
- 1. 取得IPアドレス
- 2. MACアドレスを取得
- 3. IPアドレスを取得
- 4. IPアドレスの取得
- 5. フラッシュ:シンボル名を取得
- 6. コンピュータのMACアドレスを取得
- 7. アドレスの場所を取得
- 8. クライアントマシンのIPアドレスを取得
- 9. 住所のアドレスを取得
- 10. Pythonのモジュールでdefのシンボルを取得
- 11. SilverlightでMACアドレスを取得
- 12. モノでMACアドレスを取得
- 13. WANアドレスの取得Java
- 14. ローカルIPアドレスの取得
- 15. kernel32のシンボルを取得する
- 16. 代わりにシンボルを取得する
- 17. 特定のアドレスの値を取得
- 18. 私のWiFiアドレスを取得するAndroid
- 19. rvalueのアドレスを取得する
- 20. ドラフトのアドレスとして「null」を取得
- 21. C/C++で命令のアドレスを取得
- 22. ブラックベリーデバイスのBluetooth MACアドレスを取得
- 23. UDFからExcelセルのアドレスを取得
- 24. IPアドレスでローカルホストのWebページを取得
- 25. ポインタのアドレスを取得する
- 26. エミュレータのシステムIPアドレスを取得する
- 27. リモートホストのMACアドレスを取得する
- 28. 私のIPアドレスを取得する
- 29. JavaでシステムのMACアドレスを取得
- 30. AIR 1.0アプリケーションのIPアドレスを取得
動作しませんでした。あなたの他の質問に対する私のコメントを見てください。 '__data_start'を'&__ data_start'に変更します。 –
@R ..素晴らしい!その作品は今!ありがとう!たぶんあなたはこれを答えに入れることができるので、私はそれを受け入れることができます。 – MetallicPriest