ご存知のように、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_SHARED
with を使用しPROT_READ
ます。「データ」セグメント (C または C++ のグローバル変数または静的変数用) はMAP_PRIVATE
with を使用しますPROT_WRITE
strace
関連するシステム コールの感覚をつかむためにプログラムを実行することで、多くのことを学ぶことができます。