周辺知識
実行可能ファイル
/etc/
ディレクトリ
リンク
オブジェクトファイル(.o
)やライブラリ(.a
、.so
)を結合し、1つの実行可能ファイルやライブラリを作成するプロセスのこと
リンカ
リンクを実行するプログラム、またはツール。
静的リンカ(ld
) と 動的リンカ(ld.so
) がある。
ライブラリ
Linux のライブラリは C言語や C++ で作られることが多い。Rust、Python、Go などでも作成することができる。
ライブラリには 静的ライブラリ と 動的ライブラリ がある。
静的ライブラリ
-
lib<ライブラリ名>.a
- オブジェクトファイル(
.o
)をまとめたもの - a:archive
- オブジェクトファイル(
-
コンパイル時 にリンクされる
- ライブラリのコードが実行可能ファイルに埋め込まれる
- ライブラリ変更時に再コンパイルが必要
- 実行可能ファイルが大きくなる
$ gcc -c mylib.c -o mylib.o # ソースファイル mylib.c をコンパイルしてオブジェクトファイルを生成
$ ar rcs libmylib.a mylib.o # オブジェクトファイル mylib.o から 静的ライブラリを生成する
$ gcc main.c -o myapp -L/home/user/mylib -lmylib # -L で指定したディレクトリにある静的ライブラリを main.c にリンクしながらコンパイルして myapp として出力する
静的ライブラリのリンク
静的リンクはプログラムの実行前に行われる。静的なリンクを行うリンカには以下がある。
-
$ ld
-
ld
の語源は link editor とされる
-
-
$ gcc
- コンパイルもできるツール
- 内部で
ld
が利用される
動的ライブラリ(共有ライブラリ)
動的ライブラリは 共有ライブラリ と呼ばれる。
-
lib<ライブラリ名>.so.<メジャーバージョン>.<マイナーバージョン>
- so:shared object
-
実行時 にリンクされる
- 「ライブラリ」と「実行ファイル」は別ファイルで存在する
- ライブラリの変更時に実行可能ファイルは再コンパイル不要
- 実行可能ファイルを小さくできる
共有ライブラリのリンク
共有ライブラリのリンクはプログラムの実行時に行われるため、リンカはプログラムをロードする機能を併せ持つ。
共有ライブラリのリンカには以下がある。リンカ自体もプログラムである。
ld.so
ld-linux.so
共有ライブラリの置き場
リンカは
に配置された共有ライブラリから必要nものを探すため、それ以外のディレクトリに配置した場合には /etc/ld.so.conf
に検索パスを追加する必要がある。
また 環境変数 $LD_LIBRARY_PATH
にパスを追加する方法もある。
リンカがリンクを実行する際に、共有ライブラリを探す場所の優先順位は以下の通り。
-
LD_LIBRARY_PATH
に記載されたパス /etc/ld.so.cache
-
/lib/
、/usr/lib/
、/etc/ld/so.conf
に記載されたパス
キャッシュ
共有ライブラリはプログラム実行の度に必要となるため、/etc/ld.so.cache
というバイナリファイルにキャッシュされ、再利用されることがある。
この /etc/ld.so.cache
を更新するためには $ ldconfig
コマンドを実行する必要がある。
$ ldconfig
/etc/ld.so.conf
を基に、/etc.ld.so.cache
を再構築する。
共有ライブラリを変更した場合に、変更前のキャッシュが使用されないようするために利用される。
$ ldd
list dynamic dependencies
$ ldd 実行可能ファイル