2

ご存知のように、Linux はldconfigすべてのライブラリをロードしてから*.so、共有ライブラリを使用するアプリケーションをリンクします。ただし、この場合、グローバル変数がどのように機能しているのか混乱しています。これらすべてのアプリケーションで共有ライブラリのコピーが 1 つしかないため、共有ライブラリのグローバル変数を共有するのでしょうか? はいの場合、どのように同期しますか?

ありがとう、

4

2 に答える 2

5

いいえ、共有されません。ライブラリのコード/テキスト セクションは共有されます。データ部分は、ライブラリを使用する各プロセスに固有です。

于 2012-09-17T01:48:04.203 に答える
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関連するシステム コールの感覚をつかむためにプログラムを実行することで、多くのことを学ぶことができます。

于 2012-09-17T05:46:32.030 に答える