ldconfig によるライブラリの更新
http://d.hatena.ne.jp/wagavulin/20091026/1256577635
●デフォルトの環境
# ldd /bin/bash
linux-vdso.so.1 => (0x00007fffdaffd000)
libtermcap.so.2 => /lib64/libtermcap.so.2 (0x000000350d000000)
libdl.so.2 => /lib64/libdl.so.2 (0x000000350c800000)
libc.so.6 => /lib64/libc.so.6 (0x000000350c000000)
/lib64/ld-linux-x86-64.so.2 (0x000000350bc00000)
#
man ldconfig
---------------------------------------------
ldconfig は処 理するライブラリのヘッダ部分とファイル名をチェックし、
どのバージョンに対してリンクを更新すべきかを判断する。
---------------------------------------------
※ヘッダ情報は以下で。
objdump -x /lib64/libtermcap.so.2.0.8
●結論
新規に作成したライブラリファイルへのリンクを有効にしたい場合は
ファイル名を大きくすること。
※ヘッダ部分が同じという前提だが。
また、別のディレクトリに格納する場合、/etc/ld.so.conf に記載すること。
記載する場合は、優先したいディレクトリをより上位に記載する。
●検証結果
(1)ファイルが同じ (ライブラリのヘッダ部分が同じ) 場合は、ファイル名の大きいものを採用
・libtermcap.so.2.1.8 > libtermcap.so.2.0.8 となる
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# cp -rp /lib64/libtermcap.so.2.0.8 /lib64/libtermcap.so.2.1.8★新規作成
#
# ll /lib64/libtermcap.so*
lrwxrwxrwx 1 root root 19 11月 28 22:37 /lib64/libtermcap.so.2 -> libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.1.8★新規作成
#
ldconfig -v を実行
# ll /lib64/libtermcap.so*
lrwxrwxrwx 1 root root 19 11月 28 22:39 /lib64/libtermcap.so.2 -> libtermcap.so.2.1.8★リンク変更
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.1.8★採用された
#
# ldd /bin/bash
linux-vdso.so.1 => (0x00007ffffdbfd000)
libtermcap.so.2 => /lib64/libtermcap.so.2 (0x000000350d000000)
libdl.so.2 => /lib64/libdl.so.2 (0x000000350c800000)
libc.so.6 => /lib64/libc.so.6 (0x000000350c000000)
/lib64/ld-linux-x86-64.so.2 (0x000000350bc00000)
#
・libtermcap.so.2.0.8 > libtermcap.so.2.0.7 となる
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# ll /lib64/libtermcap.so*
lrwxrwxrwx 1 root root 19 11月 28 22:43 /lib64/libtermcap.so.2 -> libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
#
# cp -rp /lib64/libtermcap.so.2.0.8 /lib64/libtermcap.so.2.0.7★新規作成
#
# ll /lib64/libtermcap.so*
lrwxrwxrwx 1 root root 19 11月 28 22:43 /lib64/libtermcap.so.2 -> libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.7★新規作成
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
#
#
ldconfig -v を実行
# ll /lib64/libtermcap.so*
lrwxrwxrwx 1 root root 19 11月 28 22:43 /lib64/libtermcap.so.2 -> libtermcap.so.2.0.8★変化なし
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.7★採用されない
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
#
(2) ライブラリのヘッダ部分が不適切である場合、不採用
・ブランクファイルは不採用
# ll /lib64/libtermcap.so*
lrwxrwxrwx 1 root root 19 11月 28 22:43 /lib64/libtermcap.so.2 -> libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
#
# cp -rp /lib64/libtermcap.so.2.0.8 /lib64/libtermcap.so.2.1.8
# cat /dev/null > /lib64/libtermcap.so.2.1.8
#
# ll /lib64/libtermcap.so*
lrwxrwxrwx 1 root root 19 11月 28 22:43 /lib64/libtermcap.so.2 -> libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 0 11月 28 22:46 /lib64/libtermcap.so.2.1.8★新規作成(ただしブランクファイル)
#
ldconfig -v を実行。以下が出力
---------------------------------------------------------------
ldconfig: File /lib64/libtermcap.so.2.1.8 is empty, not checked.
---------------------------------------------------------------
# ll /lib64/libtermcap.so*
lrwxrwxrwx 1 root root 19 11月 28 22:43 /lib64/libtermcap.so.2 -> libtermcap.so.2.0.8★変化なし
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 0 11月 28 22:46 /lib64/libtermcap.so.2.1.8★採用されない
#
#
・適当なファイルも不採用
# echo test > /lib64/libtermcap.so.2.1.8
#
# ll /lib64/libtermcap.so*
lrwxrwxrwx 1 root root 19 11月 28 22:43 /lib64/libtermcap.so.2 -> libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 5 11月 28 22:47 /lib64/libtermcap.so.2.1.8★ブランクファイルから適当に内容を入力
#
#
ldconfig -v を実行
# ll /lib64/libtermcap.so*
lrwxrwxrwx 1 root root 19 11月 28 22:43 /lib64/libtermcap.so.2 -> libtermcap.so.2.0.8★変化なし
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 5 11月 28 22:47 /lib64/libtermcap.so.2.1.8★採用されない
#
# strings /lib64/libtermcap.so.2.0.8 > /lib64/libtermcap.so.2.1.8
#
# ll /lib64/libtermcap.so*
lrwxrwxrwx 1 root root 19 11月 28 22:43 /lib64/libtermcap.so.2 -> libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 818 11月 28 22:50 /lib64/libtermcap.so.2.1.8★適当に内容を入力
#
ldconfig -v を実行。以下が出力
---------------------------------------------------------------
ldconfig: /lib64/libtermcap.so.2.1.8 is not an ELF file - it has the wrong magic bytes at the start.
---------------------------------------------------------------
# ll /lib64/libtermcap.so*
lrwxrwxrwx 1 root root 19 11月 28 22:43 /lib64/libtermcap.so.2 -> libtermcap.so.2.0.8★変化なし
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 818 11月 28 22:50 /lib64/libtermcap.so.2.1.8★採用されない
#
(3) ファイルが同じ (ライブラリのヘッダ部分が同じ) 系統を採用している
おそらくは、ヘッダ > ファイル名となる。
・他の種類のライブラリファイルをもとに、ライブラリファイルを作成しても採用されない
# ll /lib64/libtermcap.so*
lrwxrwxrwx 1 root root 19 11月 28 22:43 /lib64/libtermcap.so.2 -> libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
#
# ll /lib64/libdl*
-rwxr-xr-x 1 root root 23360 5月 31 06:40 /lib64/libdl-2.5.so
lrwxrwxrwx 1 root root 12 11月 28 23:01 /lib64/libdl.so.2 -> libdl-2.5.so
#
#
# cp -rp /lib64/libdl-2.5.so /lib64/libtermcap.so.2.1.8★新規作成
#
# ll /lib64/libtermcap.so*
lrwxrwxrwx 1 root root 19 11月 28 22:43 /lib64/libtermcap.so.2 -> libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 23360 5月 31 06:40 /lib64/libtermcap.so.2.1.8★新規作成 (libdl-2.5.so から作成)
# ll /lib64/libdl*
-rwxr-xr-x 1 root root 23360 5月 31 06:40 /lib64/libdl-2.5.so
lrwxrwxrwx 1 root root 12 11月 28 23:01 /lib64/libdl.so.2 -> libdl-2.5.so
#
ldconfig -v を実行。
# ll /lib64/libtermcap.so*
lrwxrwxrwx 1 root root 19 11月 28 22:43 /lib64/libtermcap.so.2 -> libtermcap.so.2.0.8★変化なし
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 23360 5月 31 06:40 /lib64/libtermcap.so.2.1.8★libdl-2.5.so 側で採用された
# ll /lib64/libdl*
-rwxr-xr-x 1 root root 23360 5月 31 06:40 /lib64/libdl-2.5.so
lrwxrwxrwx 1 root root 19 11月 28 23:02 /lib64/libdl.so.2 -> libtermcap.so.2.1.8★変化あり
#
(4) ファイル名の診断
a < b、1 < 2 で採用される
/lib64/libteq、/lib64/libtes を作成
# cp -rp /lib64/libtermcap.so.2.0.8 /lib64/libteq
# cp -rp /lib64/libtermcap.so.2.0.8 /lib64/libtes
#
# ll /lib64/libte*
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libteq★新規作成
lrwxrwxrwx 1 root root 19 11月 28 22:43 /lib64/libtermcap.so.2 -> libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtes★新規作成
#
ldconfig -v を実行。
# ll /lib64/libte*
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libteq★採用されない
lrwxrwxrwx 1 root root 19 11月 28 22:43 /lib64/libtermcap.so.2 -> libtermcap.so.2.0.8★変化なし
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtes★採用されない
#
/lib64/libtermcaq.so.2.1.8 を作成
# cp -rp /lib64/libtermcap.so.2.0.8 /lib64/libtermcaq.so.2.1.8
#
# ll /lib64/libte*
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libteq
lrwxrwxrwx 1 root root 19 11月 28 22:43 /lib64/libtermcap.so.2 -> libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcaq.so.2.1.8★新規作成
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtes
#
ldconfig -v を実行。
#
# ll /lib64/libte*
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libteq
lrwxrwxrwx 1 root root 19 11月 28 23:18 /lib64/libtermcap.so.2 -> libtermcaq.so.2.1.8★変化あり
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcaq.so.2.1.8★採用された
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtes
#
lib64/libtermcao.so.2.0.8、/lib64/libtermcaq.so.2.0.8 を作成
# ll /lib64/libte*
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libteq
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcao.so.2.0.8★新規作成
lrwxrwxrwx 1 root root 19 11月 28 23:22 /lib64/libtermcap.so.2 -> libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcaq.so.2.0.8★新規作成
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtes
#
#
ldconfig -v を実行。
# ll /lib64/libte*
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libteq
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcao.so.2.0.8
lrwxrwxrwx 1 root root 19 11月 28 23:22 /lib64/libtermcap.so.2 -> libtermcaq.so.2.0.8★変化あり
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8★採用されない
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcaq.so.2.0.8★採用された
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtes
#
libtcrmcap.so.2.0.8、libtfrmcap.so.2.0.8 を新規作成
# ll /lib64/libt[c-f]*
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtcrmcap.so.2.0.8★新規作成
lrwxrwxrwx 1 root root 19 11月 29 00:25 /lib64/libtermcap.so.2 -> libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtfrmcap.so.2.0.8★新規作成
#
ldconfig -v を実行。
# ll /lib64/libt[c-f]*
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtcrmcap.so.2.0.8
lrwxrwxrwx 1 root root 19 11月 29 00:26 /lib64/libtermcap.so.2 -> libtfrmcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtfrmcap.so.2.0.8★採用された
#
(5)/etc/ld.so.conf の機能の確認
/etc/ld.so.conf の上位に記載されたディククトリを優先して参照する
[root@mail 01]# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/test01/★追加、こちらが採用された
/test02/★追加
[root@mail 01]#
# ll /lib64/libt[c-f]*
lrwxrwxrwx 1 root root 19 11月 29 00:28 /lib64/libtermcap.so.2 -> libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
#
# ll /test*
/test:
合計 0
/test01:
合計 16
-rwxr-xr-x 1 root root 15584 1月 7 2007 libtermcap.so.2.0.8
/test02:
合計 16
-rwxr-xr-x 1 root root 15584 1月 7 2007 libtermcap.so.2.0.8
/test2:
合計 0
#
# ldd /bin/bash
linux-vdso.so.1 => (0x00007fff73138000)
libtermcap.so.2 => /lib64/libtermcap.so.2 (0x000000350d000000)
libdl.so.2 => /lib64/libdl.so.2 (0x000000350c800000)
libc.so.6 => /lib64/libc.so.6 (0x000000350c000000)
/lib64/ld-linux-x86-64.so.2 (0x000000350bc00000)
#
ldconfig -v を実行。
#
# ll /lib64/libt[c-f]*
lrwxrwxrwx 1 root root 19 11月 29 00:28 /lib64/libtermcap.so.2 -> libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
#
# ll /test*
/test:
合計 0
/test01:
合計 16
lrwxrwxrwx 1 root root 19 11月 29 00:31 libtermcap.so.2 -> libtermcap.so.2.0.8★新規作成
-rwxr-xr-x 1 root root 15584 1月 7 2007 libtermcap.so.2.0.8
/test02:
合計 16
lrwxrwxrwx 1 root root 19 11月 29 00:31 libtermcap.so.2 -> libtermcap.so.2.0.8★新規作成
-rwxr-xr-x 1 root root 15584 1月 7 2007 libtermcap.so.2.0.8
/test2:
合計 0
#
# ldd /bin/bash
linux-vdso.so.1 => (0x00007fff9c52a000)
libtermcap.so.2 => /test01/libtermcap.so.2 (0x000000350d000000)★test01 が採用された
libdl.so.2 => /lib64/libdl.so.2 (0x000000350c800000)
libc.so.6 => /lib64/libc.so.6 (0x000000350c000000)
/lib64/ld-linux-x86-64.so.2 (0x000000350bc00000)
#
[root@mail 01]# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/test02/★追加、こちらが採用された
/test01/★追加
[root@mail 01]# ldconfig -v > `date +%Y%m%d%H%M%S`
[root@mail 01]#
[root@mail 01]#
#
# ll /lib64/libt[c-f]*
lrwxrwxrwx 1 root root 19 11月 29 00:28 /lib64/libtermcap.so.2 -> libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
# ll /test*
/test:
合計 0
/test01:
合計 16
-rwxr-xr-x 1 root root 15584 1月 7 2007 libtermcap.so.2.0.8
/test02:
合計 16
-rwxr-xr-x 1 root root 15584 1月 7 2007 libtermcap.so.2.0.8
/test2:
合計 0
#
# ldd /bin/bash
linux-vdso.so.1 => (0x00007fff9e5fd000)
libtermcap.so.2 => /lib64/libtermcap.so.2 (0x000000350d000000)
libdl.so.2 => /lib64/libdl.so.2 (0x000000350c800000)
libc.so.6 => /lib64/libc.so.6 (0x000000350c000000)
/lib64/ld-linux-x86-64.so.2 (0x000000350bc00000)
#
#
#
# ll /lib64/libt[c-f]*
lrwxrwxrwx 1 root root 19 11月 29 00:28 /lib64/libtermcap.so.2 -> libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
#
# ll /test*
/test:
合計 0
/test01:
合計 16
lrwxrwxrwx 1 root root 19 11月 29 00:36 libtermcap.so.2 -> libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 libtermcap.so.2.0.8
/test02:
合計 16
lrwxrwxrwx 1 root root 19 11月 29 00:36 libtermcap.so.2 -> libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 libtermcap.so.2.0.8
/test2:
合計 0
#
#
# ldd /bin/bash
linux-vdso.so.1 => (0x00007fffc3dfd000)
libtermcap.so.2 => /test02/libtermcap.so.2 (0x000000350d000000)★test02 が採用された
libdl.so.2 => /lib64/libdl.so.2 (0x000000350c800000)
libc.so.6 => /lib64/libc.so.6 (0x000000350c000000)
/lib64/ld-linux-x86-64.so.2 (0x000000350bc00000)
#
[root@mail 01]# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/aaaaa/★追加、こちらが採用された
/test02/★追加
/test01/★追加
[root@mail 01]#
[root@mail ~]# ll /lib64/libt[c-f]*
lrwxrwxrwx 1 root root 19 11月 29 00:28 /lib64/libtermcap.so.2 -> libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /lib64/libtermcap.so.2.0.8
[root@mail ~]# ll /test*
/test:
合計 0
/test01:
合計 16
lrwxrwxrwx 1 root root 19 11月 29 00:46 libtermcap.so.2 -> libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 libtermcap.so.2.0.8
/test02:
合計 16
lrwxrwxrwx 1 root root 19 11月 29 00:46 libtermcap.so.2 -> libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 libtermcap.so.2.0.8
/test2:
合計 0
[root@mail ~]# ll /aaaaa/*
lrwxrwxrwx 1 root root 19 11月 29 00:46 /aaaaa/libtermcap.so.2 -> libtermcap.so.2.0.8
-rwxr-xr-x 1 root root 15584 1月 7 2007 /aaaaa/libtermcap.so.2.0.8
[root@mail ~]# ldd /bin/bash
linux-vdso.so.1 => (0x00007fff35dfd000)
libtermcap.so.2 => /aaaaa/libtermcap.so.2 (0x000000350d000000)★aaaaa が採用された
libdl.so.2 => /lib64/libdl.so.2 (0x000000350c800000)
libc.so.6 => /lib64/libc.so.6 (0x000000350c000000)
/lib64/ld-linux-x86-64.so.2 (0x000000350bc00000)
[root@mail ~]#