Linuxには、実行可能ファイルの異なる変数を対応するメモリセグメントにマップするツールがありますか?実行可能ファイル内の変数をメモリセグメントにマップする
たとえば、実行可能ファイルに初期化済みのグローバル変数int x = 10
がある場合、このツールは変数が.data
セグメントに属していることを、次のような形式で表示する必要があります。
x .data
Linuxには、実行可能ファイルの異なる変数を対応するメモリセグメントにマップするツールがありますか?実行可能ファイル内の変数をメモリセグメントにマップする
たとえば、実行可能ファイルに初期化済みのグローバル変数int x = 10
がある場合、このツールは変数が.data
セグメントに属していることを、次のような形式で表示する必要があります。
x .data
あなたの実行ファイルが取り除かないであれば、nm
commandは(もLinux manpage for nm
参照)あなたがやりたいだろう - それは、シンボル名/住所/種類のテーブルを出力します。複数の出力オプションがあります。 Linuxでは、 "sysv"形式の書式設定は、あなたに必要なものを与えることに近くなります。サンプル:
$ nm -f sysv /bin/perlあなたがCのソースコードからオブジェクトファイルを作成した場合は:Symbols from /bin/perl:
Name Value Class Type Size Line Section
Bases.3 |000000000813019c| d | OBJECT|0000000000000014| |.data F0convert |00000000080c6905| t | FUNC|00000000000000c6| |.text PL_AMG_names |0000000008137c80| D | OBJECT|0000000000000108| |.data PL_No |0000000008137904| D | OBJECT|0000000000000004| |.data PL_Yes |0000000008137900| D | OBJECT|0000000000000004| |.data [ ... ] PL_curinterp |0000000008138e88| B | OBJECT|0000000000000004| |.bss PL_do_undump |0000000008137910| D | OBJECT|0000000000000001| |.data PL_dollarzero_mutex |0000000008138e58| B | OBJECT|0000000000000018| |.bss PL_fold |000000000812c020| R | OBJECT|0000000000000100| |.rodata PL_fold_locale |0000000008135c80| D | OBJECT|0000000000000100| |.data PL_force_link_funcs |0000000008137da0| D | OBJECT|00000000000006c8| |.data PL_freq |000000000812c120| R | OBJECT|0000000000000100| |.rodata PL_hexdigit |0000000008137908| D | OBJECT|0000000000000004| |.data PL_memory_wrap |000000000812bfa3| R | OBJECT|0000000000000013| |.rodata [ ... ] PerlIO_setpos |0000000008112134| T | FUNC|00000000000000a6| |.text PerlIO_sprintf |00000000081122ee| T | FUNC|000000000000002a| |.text PerlIO_stdio |0000000008138720| D | OBJECT|0000000000000070| |.data PerlIO_stdoutf |0000000008112066| T | FUNC|000000000000003b| |.text [ ... ]
int x = 10;
とnm
を通じてその実行を、それが与える:
$ nm -f sysv xxxx.o Symbols from xxxx.o: Name Value Class Type Size Line Section x |0000000000000000| D | OBJECT|0000000000000004| |.data
は、それによって報告Value
フィールドがアドレスであることに注意してください変数の内容ではなく、前記シンボルのである。
strip
を実行すると、この表は削除され、すべてnm
は「記号なし」と表示します。
パーフェクト!これは私が望んでいたものです –
なぜそれを聞かれますか?なぜあなたにとって重要なのですか?あなたは 'nm'と' objdump'を使うことができます(おそらく 'awk'を書いてそれらの出力を合成します)。 –
@BasileStarynkevitch:上記のような出力を表示するオプションが 'objdump'にありますか? –
あなたのフォーマットではありませんが、 'objdump -t -h'は便利です(おそらく' nm'の出力と組み合わされるでしょう)。しかし、あなたは本当にその理由を説明する必要があります。グローバルを '.bss'または' .data'に入れることは、IMHOはビルディングチェーンの実装の詳細です。 –