0

私は明日試験のために勉強しています、そして私はこの質問に出くわしました:

straceを使用して実行可能ファイルを実行すると、標準のClibに関して次のシステムコールが発生します。

  • open( "/ lib / libc.so.6"、 "O_RDONLY")= 3
  • mmap(NULL、36803630、PROT_READ | PROT_EXEC、MAP_PRIVATE | MAP_DENYWRITE、3、0)= 0x7f312ab35000
  • mmap(0x7f312aeae000、20480、PROT_READ | PROT_WRITE、MAP_PRIVATE | MAP_FIXED | MAP_DENYWRITE、3、0x179000)= 0x7f312aeae000

問題は、mmapの最初のシステムコールがPROT_READ | PROT_EXECを使用し、2番目のシステムコールがPROT_READ|PROT_WRITEを使用する理由です。

各mmap呼び出しの後に何が起こるかを詳しく説明してください。プロセスがlibc(書き込みアクセス)を変更する必要がある理由がわかりません。

4

1 に答える 1

2

マップはプライベート(MAP_PRIVATE)であるため、何も変更されていませんlibc.so。代わりに、からマップされたページのプライベート(プロセスへの)コピーを変更しますlibc.so。これには、データセグメント(libcのグローバル変数)、グローバルオフセットテーブル(GOT)、および実行時にライブラリを特定のアドレスに再配置するために必要なその他の構造が含まれます。

于 2012-05-25T16:01:29.383 に答える