0. はじめに
Linuxにおける動的共有ライブラリ(以下、共有ライブラリ)に関する備忘録です。
参考文献のブログが大変参考になりましたので、より詳しく知りたい方はそちらもご確認ください。
1 共有ライブラリの役割
共有ライブラリは、実行ファイルを実行する際に動的にリンクされ、共有ライブラリに実装された機能を実行ファイルに提供します。
1.1 実行ファイルが必要とする共有ライブラリの確認方法
readelfコマンドやlddコマンドによって、実行ファイルが必要とする共有ライブラリを確認できます。
lddコマンドの場合は、共有ライブラリが必要とする共有ライブラリも表示されますので、より多くの共有ライブラリが表示されます。
# readelf -d /bin/ls
Dynamic section at offset 0x1fa38 contains 28 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libselinux.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
# ldd -d /bin/ls
linux-vdso.so.1 (0x00007ffffa256000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f719cdc9000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f719c9d8000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f719c767000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f719c563000)
/lib64/ld-linux-x86-64.so.2 (0x00007f719d213000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f719c344000)
1.2 共有ライブラリのバージョン確認方法
共有ライブラリの命名規則は、<ライブラリ名>.so.<メジャーバージョン番号>.<マイナーバージョン番号>.<リリースバージョン番号>となっています。
libgdal.so.20.3.2を例にすると、以下のように対応しています。
- メジャーバージョン番号:20
- マイナーバージョン番号:3
- リリースバージョン番号:2
バージョンの話になると、バージョンの不一致が気になる方も多いと思います。
結論としては、メジャーバージョン番号までを気にすれば良いです。理由は、メジャーバージョン番号が同じであれば、ABIが保たれるため、実行ファイルを実行する際に問題とならないからです。readelfやlddで共有ライブラリを確認した際にも、メジャーバージョン番号までしか表示されないようになっています。これは、シンボリックリンクを使って、マイナーバージョン番号やリリースバージョン番号が書かれた実体を隠蔽するように作り込まれているからです。
2. 共有ライブラリの保存先
共有ライブラリの保存先は、/etc/ld.so.confや環境変数($LD_LIBRARY_PATH)に指定されています。
2.1 /etc/ld.so.conf
共有ライブラリの保存先は /etc/ld.so.confに記載されています。
筆者の環境で確認すると、/etc/ld.so.conf.d/*.confの中身を読み込むようで、
# cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf
例えば、/etc/ld.so.conf.d/x86_64-linux-gnu.confを確認すると、以下のように共有ライブラリの保存先が記載されていました。
# cat /etc/ld.so.conf.d/x86_64-linux-gnu.conf
/usr/local/lib/x86_64-linux-gnu
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
2.2 $LD_LIBRARY_PATH
共有ライブラリの読み込み先として独自ディレクトリを追加する場合は、$LD_LIBRARY_PATHという環境変数を利用します。
# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"追加したいディレクトリのパス"
3. 参考文献