【初級者向け】ライブラリの管理 ~ ライブラリについて ~
今回の内容
今回は、ライブラリに関して解説していきます。
覚えておきたいキーワード
・スタティックライブラリ
・ダイナミックライブラリ
概要
ライブラリとは、汎用的なプログラムをひとまとめにしたものです。
ライブラリを使用することにより、プログラム開発の工数を削減することが可能です。
ライブラリには「スタティックライブラリ」と「共有ライブラリ」の2種類があります。
ライブラリの種類
特徴 | ファイル名 | |
---|---|---|
スタティックライブラリ | 実行ファイル作成時に、あらかじめライブラリを埋め込む形で使用 | lib●●.a |
共有ライブラリ | 実行ファイルを実行するタイミングで、ライブラリを読み込む形で使用 | lib●●.so.●● |
上記のような特徴があるため、以下のことが言えます。
スタティックライブラリ | 共有ライブラリ | |
---|---|---|
実行ファイルサイズ | 大 | 小 |
起動時間 | 長 | 短 |
ライブラリ変更の適用 | 再コンパイル | 自動 |
要するに、ライブラリの処理が実行形式ファイルにひとまとめになっているのか、別のファイルとして存在しているかというのが大きな違いとなります。
実行形式ファイルのサイズが大きければ、起動にかかる時間も長くなります。また、ライブラリ内に含まれる処理に変更を加えた際に、スタティックライブラリの場合は再度埋め込んでコンパイルをし、実行形式ファイルを作成し直す必要がでてきます。
インストール直後のLinux環境にも、既にライブラリが含まれています。
ライブラリの多くは、/libや/lib64、/usr/libに配置されています。
配置されているライブラリは共有ライブラリがほとんどですが、注意深く探してみると「lib●●.a」という名称のファイル(スタティックライブラリ)も見つかるはずです。
ライブラリ管理コマンド
・lddコマンド
コマンドに代表されるプログラムは、共有ライブラリを参照して実行されます。必要な共有ライブラリが存在しないと、プログラムを実行することができません。また、ライブラリの中には、別のライブラリが必須のものもあります。
このようなプログラムとライブラリ、ライブラリとライブラリの関係を「依存」といいます。
lddコマンドは、この依存性を確認するために使われるコマンドとなります。
以下は、lsコマンドと依存関係にある共有ライブラリを表示した結果です。
[root@localhost ~]# ldd /bin/ls linux-vdso.so.1 (0x00007ffe8f33e000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f3bd5733000) libcap.so.2 => /lib64/libcap.so.2 (0x00007f3bd552d000) libc.so.6 => /lib64/libc.so.6 (0x00007f3bd516b000) libpcre2-8.so.0 => /lib64/libpcre2-8.so.0 (0x00007f3bd4ee7000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f3bd4ce3000) /lib64/ld-linux-x86-64.so.2 (0x00007f3bd5b81000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f3bd4ac3000)
結果は
で表されます。※1行目のlinux-vdso.so.1は特殊な共有ライブラリで、カーネル自体に埋め込まれています。
基本的なコマンドであるlsも、これだけの共有ライブラリに依存していることが分かります。
・ldconfigコマンド
Linux上で実行される多くのプログラムは、ダイナミックリンクという手法を用いています。これは、プログラム実行時に必要となる共有ライブラリを探し、必要に応じたリンクを形成するという仕組みです。
ダイナミックリンクの検索対象を設定するファイルが/etc/ld.so.confとなります。しかし、実際にはこれをもとに/etc/ld.so.cacheというファイルが作成され、利用されています。検索対象となるディレクトリの調整を行いたい場合、ld.so.confに変更を加えた後、ld.so.cacheに変更を反映する必要があります。この反映を行うコマンドがldconfigとなります。
以下は、ld.so.confの内容となります。
[root@localhost ~]# cat /etc/ld.so.conf include ld.so.conf.d/*.conf
ld.so.conf内では、「ld.so.conf.d」ディレクトリ下の~.confファイルを読み込みますという記述がされています。こちらも確認してみます。
[root@localhost ~]# ls /etc/ld.so.conf.d bind-export-x86_64.conf libiscsi-x86_64.conf kernel-4.18.0-193.el8.x86_64.conf
3つの~.confファイルが存在することが分かりました。例として、bind-export-x86_64.confの内容を確認してみます。
[root@localhost ~]# cat /etc/ld.so.conf.d/bind-export-x86_64.conf /usr/lib64//bind9-export/
このようにファイル内にパスを記述し、共有ライブラリの検索対象の設定を行っています。
共有ライブラリの参照について
前述のような共有ライブラリの検索対象設定のほかに、環境変数を使用して検索対象とする方法もあります。
環境変数とは、OSが提供しているシステムの属性情報を記録したものになります。環境変数には様々な種類があり、プログラムが環境変数を参照する場合もあります。
共有ライブラリの検索対象を設定する環境変数は、LD_LIBRARY_PATHとなります。
この環境変数に検索対象としたいディレクトリのパスを追加することで、そのディレクトリも検索対象に含まれることになります。
LD_LIBRARY_PATHに設定したディレクトリが最も優先的に検索されることになります。評価順は以下の通りです。
- LD_LIBRARY_PATH
- /etc/ld.so.cache
- /usr/libと/lib、/lib64
/usr/libと/libに関しては、最も一般的な共有ライブラリの配置場所となっておりますので、1や2で設定が行われていなくとも、この2つのディレクトリを検索してくれます。
実際に依存関係にあるものも含め、すべてインストールを行うと、大体これらのディレクトリに共有ライブラリが配置されるのが分かるかと思います。
インストールに関する記事を見た後に確認をしてみましょう。
まとめ
今回はライブラリについての内容でした。2つの種類のうち、特に共有ライブラリの取り扱いに関しての比重が大きいので、しっかりと押さえておきましょう。