1

私の理解に基づいて、C/C++ プログラムはメモリ内で次のようになります。

C プログラムのメモリ レイアウト。 出典:インターネット

私は次のことを知りたかった:

  1. 実行中のプログラムの「テキストセクション」にアクセスできますか? アクセスするとは、開始アドレスと終了アドレスを出力して内容を調べることを意味します。
  2. 実行時に「テキストセクション」をメモリ内の他のアドレスに再配置できますか?

ありがとう、

4

1 に答える 1

9

これはオペレーティング システム固有です。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....) を使用すると、プログラムのシンボルに (内部から) アクセスできます。NULLfilename

アドレス空間仮想メモリASLR位置に依存しないコード再配置ABIJIT コンパイル名前マングリングx86-64 ABI 仕様、および高度な Linux プログラミングの本に関するウィキページも参照してください。

于 2013-11-08T05:54:15.827 に答える