私は共有ライブラリがどのように機能するかをよりよく理解しようとしてきましたが、2 つのことについて頭を悩ますことができません。
1-各プロセスには独自の仮想メモリ空間とページテーブルがあるため、共有ライブラリが1つのプロセス仮想メモリ空間にロードされた場合、2番目のプロセスはメモリ空間にないため、どのようにしてその共有ライブラリにアクセスできますか?
2- テキスト セクションのみが共有され、グローバル データは共有されないことを理解しています。これはどのように可能ですか? 私の理解では、グローバル変数への各参照はグローバル オフセット テーブル(略して GOT) を介して行われます。したがって、このコード行がある場合、これは、GOT のベース値として使用されるアセンブリのx = glob
ようなものとほぼ同じになります。しかし、この場合、どのプロセスがその行を呼び出しても、GOT のオフセット 0x10 にあるアドレスを持つ同じグローバル変数に常にアクセスすることは明らかです。では、2 つのプロセスが同じ GOT エントリを参照する同じテキスト セクションを使用する場合、どのようにしてグローバル変数の異なるコピーを持つことができるのでしょうか?mov eax,DWORD PTR [ecx-0x10]
ecx