あるファイルが何のファイルかを判別するためのコマンドfileコマンドがありますが、どうやって調べているのかというと、
- デバイスファイルやディレクトリ、シンボリックリンクなどの特別なファイルかどうか
- 圧縮ファイルかどうか
- magicファイルに基づいての判定
- テキストファイルの種別判定
といった順番で判定しているようです。ここでいうmagicファイルとは、/usr/share/misc/magic ファイルのことで、判定条件が書かれています。例えば、以下のような記述の場合。
# updated by Daniel Quinlan (quinlan@yggdrasil.com) 0 string \177ELF ELF >4 byte 0 invalid class >4 byte 1 32-bit >4 byte 2 64-bit
先頭から0バイト目に\177ELFがあればELFファイル。”>” は続けての意味で、続けて先頭から4バイト目が0ならばinvalid class、1ならば32-bit、2ならば64-bitという意味で書かれています。
実際にodコマンドで/bin/lsを表示してみると、先頭がELFで4バイト目が2になっているので、ELFファイルで64bitだとわかります。(※今回は64bit OSを使用しています)
# od -c /bin/ls 0000000 177 E L F 002 001 001 \\0 \\0 \\0 \\0 \\0 \\0 \\0 \\0 \\0 0000020 002 \\0 > \\0 001 \\0 \\0 \\0 ` $ @ \\0 \\0 \\0 \\0 \\0 0000040 @ \\0 \\0 \\0 \\0 \\0 \\0 \\0 250 \\ 001 \\0 \\0 \\0 \\0 \\0 以下省略