実行時のライブラリ探索
- 実行時のライブラリ探索パスは/etc/ld.so.confに書いてあるディレクトリ。
- 環境変数LD_LIBRARY_PATHでも指定可能。
- Linux共有ライブラリの簡単なまとめ
ライブラリについて
静的ライブラリ,共有ライブラリ,動的リンク,静的リンク
静的ライブラリとは
- 静的ライブラリ (static library) は ar コマンドで .o をまとめて作った .a ファイル.
- libhoge.a が有る時,gcc に -lhoge オプションを与えるとリンクされる.
- データが全て含まれるので .a ファイルはコンパイル時のみ必要
- .a ファイルの中身は .o ファイルの連結のようなものであり,連結時に与えた順番通りに読み込まれる
共有ライブラリとは
- 共有ライブラリ (shared library) は gcc に -shared オプションを与えて得られる .so ファイル.
- libhoge.so が有る時,gcc に -lhoge オプションを与えるとリンクされる.
共有ライブラリの動的リンクとは
- 共有ライブラリは通常は動的リンクされる.
- .so ファイルの内容は実行ファイルに含まれず,.so ファイルが必要であるということが記録される.
- 実行時に,動的リンカローダがメモリマップを弄って同じプロセスから使えるようにする.
- ldd コマンドで動的リンクされ依存している .so ファイルが見れる.
共有ライブラリの静的リンクとは
- 共有ライブラリも静的リンクできる.gcc に -static オプションを与えると共有ライブラリが静的リンクされる.この場合,.so フィアルに依存しない.
- 他にも 例えば -static-libstdc++ と与えると libstdc++.so への依存が消える.
- 吐かれるバイナリは大きくなる.
動的リンクの利点
- ファイルサイズが小さくなる.
- 複数のプロセスから共有することにより使用メモリも少なくなる (Position Independent Code (PIC)).
- ABI を壊さなければ,共有ライブラリを入れ替えるだけで処理を変えられる.
静的リンクの利点
- .so ファイルが設置されていない環境でも動く.
Position Independent Code (PIC) とは
- 実行時の再配置が不要なオブジェクトファイル.
- gcc に -fPIC オプションを与えると生成される.
- PIC でない共有ライブラリを作ることも可能だが,再配置のぶんプログラムの起動が遅くなる上,書き換えによってメモリ上の共有が行われなくなる.
- しかし,PIC でない共有ライブラリの方が読み込み後の実行速度は早い(と思う).
参考にさせて頂いたページ