コマンド file
file コマンドは、ファイルの先頭部分を解析して、そのファイルが何なのか教えてくれる。
$ file /bin/ls /etc/hosts /usr/bin/yum /bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=c8ada1f7095f6b2bb7ddc848e088c2d615c3743e, stripped /etc/hosts: ASCII text /usr/bin/yum: Python script, ASCII text executable
バイナリファイルの場合が特に詳しい表示になる。で、ちょっと詳しくみてみる。
ELF - Executable and Linkable Format はバイナリ形式の規格。昔は COFF(Common Object File Format)なんてのもあった。
LSB - least significant bit は本来、2進数の最下位ビットなんだけど、この場合は Little Endian の意味合いが強い。今のように Intel / AMD 系のCPUが独占する前は、結構CPUも多様で MIPS の設計では同じモデルでも、LSB, MSB オプションがあったりした。
SYSV - AT&T 直径の System V の略だね。
BuildID - RHEL 6 以降で採用されているチェックサムで、セキュリティ向上な感じか?
stripped - 実行に必要ないバイナリデータ(もっぱらデバッグ用のシンボル類)を削除済み。
で、MacOSもUNIXの仲間(Mach)だから、file コマンドを試してみる。
$ file /bin/ls /bin/ls: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64e:Mach-O 64-bit executable arm64e] /bin/ls (for architecture x86_64): Mach-O 64-bit executable x86_64 /bin/ls (for architecture arm64e): Mach-O 64-bit executable arm64e
おお、複数アーキテクチャに対応してる。面白い。