私の理解に基づいて、C/C++ プログラムはメモリ内で次のようになります。
私は次のことを知りたかった:
- 実行中のプログラムの「テキストセクション」にアクセスできますか? アクセスするとは、開始アドレスと終了アドレスを出力して内容を調べることを意味します。
- 実行時に「テキストセクション」をメモリ内の他のアドレスに再配置できますか?
ありがとう、
私の理解に基づいて、C/C++ プログラムはメモリ内で次のようになります。
私は次のことを知りたかった:
ありがとう、
これはオペレーティング システム固有です。Linuxのみについて回答しています。
libc6.so
まず、ほとんどのプログラムは複数の共有オブジェクト ライブラリ ( ...を含む) に動的にリンクされているため、実際には図が大きく間違っています。ld.so(8)、elf(5)、execve(2)も参照してください。単一 のセクションはありませんtext
(ただし、多くの「テキスト」のようなセグメント)。pmapおよびobjdumpコマンドについて読んでください。
cat /proc/1234/maps
すると、 ;で pid 1234 のプロセスのアドレス空間がわかります。proc(5)についてもっと読む... プログラムの内部から、 read /proc/self/maps
; たとえばcat /proc/$$/maps
、シェルでシェルプロセスのアドレス空間を表示し、そのコマンドcat /proc/self/maps
を実行しているプロセスのアドレス空間を試してみてください。mmap(2)cat
も参照してください。
テキストセクションを実際に「再配置」することはできません(実際には「移動」を意味します)。一部のアドレスはコード内に構築されています。ただし、(位置に依存しない実行可能ファイルの場合は....)の-fPIE オプションについてお読みください。gcc
もちろん、プログラムを-rdynamicフラグでリンクし、最初の引数でdlopen(3) (そしてdlsym
おそらくdladdr
....) を使用すると、プログラムのシンボルに (内部から) アクセスできます。NULL
filename
アドレス空間、仮想メモリ、ASLR、位置に依存しないコード、再配置、ABI、JIT コンパイル、名前マングリング、x86-64 ABI 仕様、および高度な Linux プログラミングの本に関するウィキページも参照してください。