らんだむな記憶

blogというものを体験してみようか!的なー

共有ライブラリ

[C言語] 共有ライブラリと静的ライブラリを整理する
.dll.soだけでやってきて頭ぷしゅぅ〜
.dylib.bundleか・・・
What is the exact difference between dynamic loading and dynamic linking? - Quora
c++ - What are the differences between .so and .dylib on osx? - Stack Overflow
を読んでもなかなかピンと来ないな。

Dynamic loading - Wikipedia

Not all systems support dynamic loading. UNIX-like operating systems such as macOS, Linux, and Solaris provide dynamic loading with the C programming language "dl" library. The Windows operating system provides dynamic loading through the Windows API.

"dl" libraryはまぁ、dlopenとかのあれだわな・・・。WindowsではLoadLibraryであると。まぁ遅延ロードのことだよなぁ・・・

動的リンクは「このシンボルは使うから絶対要るんだけど、本体の.exeには入ってないから後からシンボルのアドレスは実行時にマッピングするからな」ってことだろう。単純に。あまり動的ローディングと区別してなかったけど。まぁ、シンボルのマッピングが動的に決まるだけで、メモリ空間にシンボルが見えていることは必須だからアンロードはできんわな・・・。まぁ確かにプラグイン向けではないな・・・
とりあえず「これを使う」ってことだけを(Windowsならインポートライブラリで)知っているだけなので、動的にリンクしたシンボルの実体がバージョンアップしていても気づかない。インターフェイスが同じなら。メインの実行形式の再コンパイルは不要。まぁ・・・一番よくある動的リンクライブラリの使い方だよなぁ・・・

うーん🤔 結局いままで“動的リンク”しかまともに使ってきてないから動的リンク/動的ローディングの違いを意識してないんだよなぁ・・・。まぁそういえばごく稀にLoadLibraryとかdlopenとかすることもありますねぇ〜くらいで。

DLL の利点

メモリを節約し、スワップ処理を抑制します。 メモリ内の 1 つの DLL を複数のプロセス間で共有することにより、複数のプロセスが 1 つの DLL を同時に使うことができます。 スタティック リンク ライブラリでビルドされたアプリケーションの場合は、Windows が各アプリケーション用のライブラリ コードをメモリに読み込む必要があります。

まぁ実際にどうなってるか知らんが、動的リンクライブラリのコードはシステム上で1個だけロードされていて、各プロセスはそれを使っているんだろう・・・。きっと動的ロードだと、各プロセスのメモリ空間内に.bundleなりのコードをロードするんだろう。なので、Nプロセスあるとして、動的リンクならNが増大しても.dylibのコードをロードするのに消費するメモリはまったく変化しないが、動的ロードならNに比例してどんどん増えるんだろう・・・。たぶん。まぁ実際裏側でどう振る舞うのか知らんけど