ldconfigコマンドは共有ライブラリを使用するプログラムの実行のために、共有ライブラリのシンボリックリンクの作成や共有ライブラリを検索するためのキャッシュを作成するコマンドになります。
共有ライブラリを利用するプログラムは作成したが、ライブラリのロードができなくて、実行に失敗してしまうときに利用するコマンドかもしれません。
また、このコマンドはgcc等のコンパイル時のリンクのためのものではない点は注意が必要かもしれません。
目次
リンクとキャッシュファイルの作成
ldconfigコマンドの関連ファイルは設定ファイル/etc/ld.so.confとキャッシュファイル/etc/ld.so.cacheがあります。
ldconfigコマンドは設定ファイルから検索するパスを読み取り、そのパスからプログラムの実行時に利用するための共有ライブラリのキャッシュファイルを作成します。
例えば、共有ライブラリとその共有ライブラリを必要とするプログラムを作成してみます。
1 2 3 |
$ gcc -o libsharedprog.so.1.0 -shared -fpic -Wl,-soname,libsharedprog.so.1 sharedprog.c $ ln -s libsharedprog.so.1.0 libsharedprog.so $ gcc -o testprog -L. testprog.c -lsharedprog |
ここで、まずは作成したプログラムを実行すると
1 2 |
$ ./testprog ./testprog: error while loading shared libraries: libsharedprog.so.1: cannot open shared object file: No such file or directory |
共有ライブラリのロードに失敗をしてエラーが表示されます。
/etc/ld.so.confに共有ライブラリが存在するパスを追加します。/etc/ld.so.confは/etc/ld.so.conf.dというディレクトリから設定ファイルを読み込んでいるので、そのディレクトリに設定ファイルを入れます。
1 2 3 4 5 6 |
$ cat /etc/ld.so.conf include /etc/ld.so.conf.d/*.conf $ sudo vi /etc/ld.so.conf.d/test_ldconfig.conf ~~~編集を行う~~~ $ cat /etc/ld.so.conf.d/test_ldconfig.conf /home/ubuntu/test_ldconfig |
ldconfigコマンドを実行します。ここで、共有ライブラリにSONAMEを設定したので、シンボリックリンクも作成されます。まず、ldconfigコマンドを実行する前に作業ディレクトリの内容を確認し、その実行後にシンボリックリンクも作成されていることを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ ls -l 合計 28 lrwxrwxrwx 1 ubuntu ubuntu 20 7月 21 07:09 libsharedprog.so -> libsharedprog.so.1.0 -rwxrwxr-x 1 ubuntu ubuntu 8128 7月 21 07:09 libsharedprog.so.1.0 -rw-rw-r-- 1 ubuntu ubuntu 100 7月 20 10:31 sharedprog.c -rwxrwxr-x 1 ubuntu ubuntu 8600 7月 21 07:10 testprog -rw-rw-r-- 1 ubuntu ubuntu 70 7月 20 10:31 testprog.c $ $ sudo ldconfig $ $ ls -l 合計 28 lrwxrwxrwx 1 ubuntu ubuntu 20 7月 21 07:09 libsharedprog.so -> libsharedprog.so.1.0 lrwxrwxrwx 1 root root 20 7月 21 07:35 libsharedprog.so.1 -> libsharedprog.so.1.0 -rwxrwxr-x 1 ubuntu ubuntu 8128 7月 21 07:09 libsharedprog.so.1.0 -rw-rw-r-- 1 ubuntu ubuntu 100 7月 20 10:31 sharedprog.c -rwxrwxr-x 1 ubuntu ubuntu 8600 7月 21 07:10 testprog -rw-rw-r-- 1 ubuntu ubuntu 70 7月 20 10:31 testprog.c |
さらにldconfigによってキャッシュファイル/etc/ld.so.cacheも更新されたので実行時に共有ライブラリのロードによってエラーが出ていたプログラムの実行もできるようになります。
1 2 |
$ ./testprog shared library |
キャッシュの内容を表示(-pオプション)
-pオプションを用いるとキャッシュの内容を表示できます。
通常で用いるととても多くの行数が表示されるので、ここでは、前述で作成したlibsharedprogについて表示します。
1 2 3 |
$ ldconfig -p | grep libsharedprog libsharedprog.so.1 (libc6,x86-64) => /home/ubuntu/test_ldconfig/libsharedprog.so.1 libsharedprog.so (libc6,x86-64) => /home/ubuntu/test_ldconfig/libsharedprog.so |
詳細な情報を表示(-vオプション)
-vオプションを用いるとldconfigコマンドの実行について詳細な情報が表示されます。ここではいくつか情報を省略して紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ sudo ldconfig -v 2>/dev/null /usr/lib/x86_64-linux-gnu/libfakeroot: libfakeroot-0.so -> libfakeroot-tcp.so /lib/i386-linux-gnu: libmemusage.so -> libmemusage.so libnss_nisplus.so.2 -> libnss_nisplus-2.23.so libpcprofile.so -> libpcprofile.so ...(省略)... /usr/lib/i386-linux-gnu: libpanel.so.5 -> libpanel.so.5.9 libgpm.so.2 -> libgpm.so.2 libform.so.5 -> libform.so.5.9 ...(以下省略)... |
-vオプションとgrepコマンドを用いて、検索パスの一覧を表示することもできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ sudo ldconfig -v 2>/dev/null | grep ':$' /usr/lib/x86_64-linux-gnu/libfakeroot: /lib/i386-linux-gnu: /usr/lib/i386-linux-gnu: /usr/local/lib: /home/ubuntu/test_ldconfig: /lib/x86_64-linux-gnu: /usr/lib/x86_64-linux-gnu: /usr/lib/x86_64-linux-gnu/mesa-egl: /usr/lib/x86_64-linux-gnu/mesa: /lib64: /lib: /usr/lib: |
また、シンボリックリンクの作成が行われるときは以下のようなメッセージが表示されます。
1 2 |
$ sudo ldconfig -v 2>/dev/null | grep 'libsharedprog' libsharedprog.so.1 -> libsharedprog.so.1.0 (changed) |
個々のライブラリのリンクを作成(-lオプション)
-lオプションは個々の共有ライブラリのSONAMEのシンボリックリンクを作成を作成します。
1 2 3 4 5 6 7 8 |
$ ls libsharedprog.so.1.0 $ ldconfig -l -v libsharedprog.so.1.0 libsharedprog.so.1 -> libsharedprog.so.1.0 (changed) $ ls -l 合計 8 lrwxrwxrwx 1 ubuntu ubuntu 20 7月 21 08:18 libsharedprog.so.1 -> libsharedprog.so.1.0 -rwxrwxr-x 1 ubuntu ubuntu 8128 7月 21 08:14 libsharedprog.so.1.0 |
SONAMEはobjdumpコマンドで確認ができます。
1 2 |
$ objdump -p libsharedprog.so.1.0 | grep SONAME SONAME libsharedprog.so.1 |
(補足)使用したプログラム
sharedprog.c
1 2 3 4 5 6 7 |
#include <stdio.h> void print_text(void); void print_text (void){ printf("shared library\n"); } |
testprog.c
1 2 3 4 5 6 |
void print_text(void); int main(void){ print_text(); return 0; } |
(補足)SONAMEを付けたプログラムのコンパイル
SONAMEを付けたプログラムのコンパイルを行う場合は、gccコマンドで
-Wlオプションをつけて、リンカにオプションを渡します。-Wlオプションで渡すオプションの区切り文字はスペースではなく、コンマで行われます。
SONAMEをつける場合は"-Wl,-soname,<共有ライブラリのSONAMEの名称>"をオプションに渡します。
1 |
gcc -o libsharedprog.so.1.0 -shared -fpic -Wl,-soname,libsharedprog.so.1 sharedprog.c |
SONAMEをつけて作成できたかどうかは、objdumpコマンドで確認できます。
1 2 |
$ objdump -p libsharedprog.so.1.0 | grep SONAME SONAME libsharedprog.so.1 |
(補足)ldconfigコマンドでキャッシュを作成しなくても共有ライブラリを利用できるコンパイル方法
gccコマンドで-WlオプションでRPATHを設定するとそのRPATHのパスから共有ライブラリを検索して利用できます。
RPATHをつける場合は"-Wl,-rpath,<RPATHに設定するパス>"をオプションに付けます。
1 2 3 |
$ gcc -o testprog -L. -Wl,-rpath,/home/ubuntu/test_ldconfig testprog.c -lsharedprog $ ./testprog shared library |
RPATHをつけて作成できたかどうかはobjdumpコマンドで確認できます。
1 2 |
$ objdump -p testprog | grep RPATH RPATH /home/ubuntu/test_ldconfig |
相対パスもできるらしいです。
1 2 3 4 5 6 |
$ gcc -o testprog -L. -Wl,-rpath,. testprog.c -lsharedprog $ ./testprog shared library $ $ objdump -p testprog | grep RPATH RPATH . |