コマンド 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 - 実行に必要ないバイナリデータ(もっぱらデバッグ用のシンボル類)を削除済み。

で、MacOSUNIXの仲間(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

おお、複数アーキテクチャに対応してる。面白い。