私はメモリアドレスをよりよく理解しようとしています。私hexdump.
はEx出力でバイナリを確認し始めました。
0000000 cf fa ed fe 07 00 00 01 03 00 00 80 02 00 00 00
0000010 0e 00 00 00 b0 03 00 00 85 00 00 00 00 00 00 00
0000020 19 00 00 00 48 00 00 00 5f 5f 50 41 47 45 5a 45
0000030 52 4f 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000040 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00
私が理解したように、各行の先頭に表示されるコードは、ベースアドレスのオフセットで表される相対メモリアドレスです。絶対住所を知る方法があるかどうか疑問に思います。
これらのアドレスを明示的に表示したり、そのアドレスが相対的なベースアドレスを特定して直接計算できるようにするソリューションがあればうれしいです。
答え1
Hexdumpはアドレス(またはメモリ)について何も知りません。単にバイトストリームを印刷し、これまでに見たバイト数を前に追加します。入力がファイルから来る場合、この数字はファイルの場所に対応します。
ファイルがロードされた後にこれらのバイトがメモリ内で終わる場所を特定するには、ファイルのメタデータを調べる必要があります。 ELFファイルの場合、これはセクションヘッダー(場合によってはプログラムヘッダー)を意味します。
readelf -S path/to/your/binary
次のように表示します。
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
…
[13] .text PROGBITS 000000000050eac0 0010eac0
0000000001833275 0000000000000000 AX 0 0 16
…
ここで、「オフセット」値はファイル内の特定のセクションが始まる場所であり、「アドレス」値は対応する仮想アドレス(メモリで終わる場所)です。hexdump
住所を取得するには、これらの2つの違いを数字に追加するだけです。
objdump -h path/to/your/binary
以下を使用して同じデータを取得することもできます。
Sections:
Idx Name Size VMA LMA File off Algn
…
12 .text 01833275 000000000050eac0 000000000050eac0 0010eac0 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
…
同様に、「ファイルオフ」はファイルのオフセットであり、「VMA」は対応する仮想アドレスである。 「LMA」が何なのか気になったら見てくださいここ。
答え2
私が理解したのは、絶対物理アドレスは非常に安全です。しかし、論理アドレスを見つける方法があります。学習目的のために無限ループを含み、バックグラウンドで実行される単純なCプログラムを書くことができます。プログラムの実行中は、Linuxユーティリティ「pmap」を使用してプログラムの仮想アドレスをバイパスできます。 Linux zshのバックグラウンドで実行可能ファイルを実行するコマンド:
実行可能ファイル名と
pmap -x process_id