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 ~]#