portsでビルドするときに、とある共有ライブラリがインストールされていない、と誤判定されるので、調べてみた。
誤判定の原因は「file -L」コマンドの出力。
# /usr/bin/file -L --mime-type /usr/local/lib/libdconf.so
/usr/local/lib/libdconf.so: application/x-symlink
「file -L」は、symbolic linkで参照する先の情報を返すはずなのに、なぜかそうならない。
# ls -l /usr/local/lib/libdconf.so*
lrwxr-xr-x 1 root wheel 13 3月 9 2013 /usr/local/lib/libdconf.so -> libdconf.so.0
-r-xr-xr-x 1 root wheel 35236 3月 9 2013 /usr/local/lib/libdconf.so.0
ためしに別のFreeBSD 8.4なホストで同じコマンドを実行してみると
> /usr/bin/file -L --mime-type /usr/local/lib/libdconf.so
/usr/local/lib/libdconf.so: application/x-sharedlib
となって、こちらは正常。ちゃんとsymbolic linkの先を見て判定している。
とりあえずktraceしてみたら、
38039 file NAMI "/usr/local/lib/libdconf.so"
38039 file STRU struct stat {dev=107, ino=354962, mode=lrwxr-xr-x , nlink=
1, uid=0, gid=0, rdev=1684171116, atime=1362790516, stime=1362790516, ctime=1362
790516, birthtime=1362790516, size=13, blksize=16384, blocks=0, flags=0x0 }
38039 file RET lstat 0
38039 file CALL readlink(0xbfbfe885,0xbfbfd534,0x3ff)
38039 file NAMI "/usr/local/lib/libdconf.so"
38039 file RET readlink 13/0xd
38039 file CALL stat(0xbfbfcd30,0xbfbfccd0)
38039 file NAMI "/usr/local/lib/libdconf.so.0"
38039 file STRU struct stat {dev=107, ino=354912, mode=-r-xr-xr-x , nlink=
1, uid=0, gid=0, rdev=1464768, atime=1379105689, stime=1362790516, ctime=1362790
516, birthtime=1362790516, size=35236, blksize=16384, blocks=72, flags=0x0 }
38039 file RET stat 0
38039 file CALL write(0x1,0x33e03000,0x32)
38039 file GIO fd 1 wrote 50 bytes
"/usr/local/lib/libdconf.so: application/x-symlink
"
38039 file RET write 50/0x32
という感じで、ちゃんとreadlinkもして"/usr/local/lib/libdconf.so.0"を見に行っているようにも見えるけど、なぜなんだろう。
正常に動いているホストと、正常に動かないホストとを、ざっくりと比較してみる。
正常なホスト。
> kdump | grep NAMI
19755 ktrace NAMI "/usr/bin/file"
19755 ktrace NAMI "/libexec/ld-elf.so.1"
19755 file NAMI "/etc/libmap.conf"
19755 file NAMI "/var/run/ld-elf.so.hints"
19755 file NAMI "/lib/libmagic.so.4"
19755 file NAMI "/usr/lib/libmagic.so.4"
19755 file NAMI "/usr/lib/libmagic.so.4"
19755 file NAMI "/lib/libz.so.5"
19755 file NAMI "/lib/libz.so.5"
19755 file NAMI "/lib/libc.so.7"
19755 file NAMI "/lib/libc.so.7"
19755 file NAMI "/home/yoshin-t/.magic"
19755 file NAMI "/etc/malloc.conf"
19755 file NAMI "/usr/share/misc/magic.mime.mgc"
19755 file NAMI "/usr/share/misc/magic.mgc"
19755 file NAMI "/usr/local/lib/libdconf.so"
19755 file NAMI "/usr/local/lib/libdconf.so"
19755 file NAMI "/usr/local/lib/libdconf.so"
正常じゃないホスト。
# kdump |grep NAMI
38039 ktrace NAMI "/usr/bin/file"
38039 ktrace NAMI "/libexec/ld-elf.so.1"
38039 file NAMI "/etc/libmap.conf"
38039 file NAMI "/var/run/ld-elf.so.hints"
38039 file NAMI "/lib/libmagic.so.4"
38039 file NAMI "/usr/lib/libmagic.so.4"
38039 file NAMI "/usr/lib/libmagic.so.4"
38039 file NAMI "/lib/libz.so.5"
38039 file NAMI "/lib/libz.so.5"
0x0ce0 1200 0a00 005f 4459 4e41 4d49 4300 5f47 |....._DYNAMIC._G|
38039 file NAMI "/lib/libc.so.7"
38039 file NAMI "/lib/libc.so.7"
38039 file NAMI "/usr/share/locale/ja_JP.eucJP/LC_CTYPE"
38039 file NAMI "/etc/malloc.conf"
38039 file NAMI "/root/.magic"
38039 file NAMI "/usr/share/misc/magic.mime.mgc"
38039 file NAMI "/usr/share/misc/magic.mime.mgc"
38039 file NAMI "/usr/share/misc/magic"
38039 file NAMI "/usr/share/misc/magic"
38039 file NAMI "/usr/local/lib/libdconf.so"
38039 file NAMI "/usr/local/lib/libdconf.so"
38039 file NAMI "/usr/local/lib/libdconf.so.0"
正常じゃないホストでは、"/usr/share/misc/magic.mime.mgc"というファイルをアクセスしているらしい。
正常なホスト
> ls -l /usr/share/misc/magic*
-r--r--r-- 1 root wheel 536241 Jul 14 10:06 /usr/share/misc/magic
-r--r--r-- 1 root wheel 1751200 Jul 14 10:06 /usr/share/misc/magic.mgc
正常じゃないホスト
# ls -l /usr/share/misc/magic*
-r--r--r-- 1 root wheel 536241 7月 20 12:17 /usr/share/misc/magic
-r--r--r-- 1 root wheel 1751200 7月 20 12:17 /usr/share/misc/magic.mgc
-r--r--r-- 1 root wheel 33539 10月 21 2009 /usr/share/misc/magic.mime
-r--r--r-- 1 root wheel 46208 10月 21 2009 /usr/share/misc/magic.mime.mgc
正常じゃないホストでは、/usr/share/misc/magic.mime.mgc とか、タイムスタンプの古いファイルがある。旧バージョンのときのファイルが残っていたのだろうか?
ためしに、ファイルmagic.mime*を、別の場所へ待避させてみる。
# mkdir /usr/share/misc-
# mv /usr/share/misc/magic.mime* /usr/share/misc-/
# /usr/bin/file -L --mime-type /usr/local/lib/libdconf.so
/usr/local/lib/libdconf.so: application/x-sharedlib
直った!
ちなみに、「-L」オプションを付けないときは、symbolic linkだと判定され、これは正常。
# /usr/bin/file --mime-type /usr/local/lib/libdconf.so
/usr/local/lib/libdconf.so: application/x-symlink
0 件のコメント:
コメントを投稿