2013年9月14日土曜日

(FreeBSD) /usr/bin/file -L --mime-type すると application/x-symlink と出てくる

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





20130913



0 件のコメント:

コメントを投稿