ご存知のように、Linux はldconfigすべてのライブラリをロードしてから*.so、共有ライブラリを使用するアプリケーションをリンクします。ただし、この場合、グローバル変数がどのように機能しているのか混乱しています。これらすべてのアプリケーションで共有ライブラリのコピーが 1 つしかないため、共有ライブラリのグローバル変数を共有するのでしょうか? はいの場合、どのように同期しますか?
ありがとう、
ご存知のように、Linux はldconfigすべてのライブラリをロードしてから*.so、共有ライブラリを使用するアプリケーションをリンクします。ただし、この場合、グローバル変数がどのように機能しているのか混乱しています。これらすべてのアプリケーションで共有ライブラリのコピーが 1 つしかないため、共有ライブラリのグローバル変数を共有するのでしょうか? はいの場合、どのように同期しますか?
ありがとう、
いいえ、共有されません。ライブラリのコード/テキスト セクションは共有されます。データ部分は、ライブラリを使用する各プロセスに固有です。
私がコメントしたように:
リンカーとローダーに関する Levine の本は参考になります。
Linux ダイナミック リンカld.soはフリー ソフトウェアであり、GNU libcの一部であり、そのソース コードを調べて改善することができます。
動的リンカはそうではありld.soませんldconfig(これは によって使用されるキャッシュされた情報を更新しただけld.soです)。
ld.soリンカーはmmap(2)システム コールを使用して、一部のセグメント.soをプロセスの仮想アドレス空間に射影しています。「テキスト」セグメント (コードおよび読み取り専用定数用) はMAP_SHAREDwith を使用しPROT_READます。「データ」セグメント (C または C++ のグローバル変数または静的変数用) はMAP_PRIVATEwith を使用しますPROT_WRITE
strace関連するシステム コールの感覚をつかむためにプログラムを実行することで、多くのことを学ぶことができます。