c 静的リンク Linux の 2 つの異なるプロセスによって共有ライブラリ ファイルがどのように呼び出されますか?




共有ライブラリ 静的リンク (2)

Linuxでは、私はfoo.soという共有ライブラリファイルを持っています。私は2つの異なるプロセスp1、p2を実行すると、両方ともfoo.soを使用します。 このfoo.soは2つのプロセスによって重複しますか?


共有ライブラリのコードは、オペレーティングシステムによってメモリにコピー(またはより正確にはマップ)されます。

その後、OSはそれぞれのプロセスにメモリ内のその1つのコピーへのアクセス権を与えます。

それぞれのプロセスがコピーを他のものとは異なるメモリアドレスにあると見なす可能性があります。 これは、CPUのメモリ管理ユニットによって解決されます。

これよりも複雑になる可能性はありますが、それは基本的に、LinuxやMac OS Xなどの他のUnix関連のオペレーティングシステムでの動作です。


Unixベースのシステム(Linuxを含む)では、 コードセグメント(.text)は不変なので、複数のプロセス間で共有される可能性があります 。 これはあなたが言及する重複ですか?

基本的に、静的データ(グローバル変数など)を含む各共有ライブラリには、 グローバルオフセットテーブル(GOT)があります。 共有ライブラリでは、静的データへの参照はすべてグローバル変数とみなされます(間接的です)。 したがって、たとえコードセグメントが複数のプロセス間で共有されていても、各プロセスは、それぞれのGOTを含む共有ライブラリの他のセグメントの排他的なマッピングを持ち、エントリはそれに応じて再配置されます。

要するに、 コードだけがプロセス間で共有され、データでは共有されません 。 しかし、私は定数がコンパイルフラグに依存して例外と考えています。

私はまた、 動的リンクと読み込みの記事をお勧めします。





shared