【追記】さらにその後,「『7f454c46 01010100 00000000 00000000』の時点でelfファイルであることは判るが,Linuxで作られたかは0x0114バイトは見ないと判らないはず,この人は『バイナリ萌え』ではない!」との突っ込みを頂きました.
0xcafebabe の話を知った大学生の頃,危うくバイナリ萌えの暗黒面に落ちそうになったものの,軽うじて生還して今は普通人として暮らしています.
というわけでバイナリ萌えでない私にとっては,上の「Linuxで作られたかは0x0114バイトは見ないと判らない」はすごく不思議だった.だって
ELF
って 8 バイト目に OS/
…と思って手近にあった Vine Linux に転がっているバイナリを調べてみると,8 バイト目は軒並 0x00 なのであった.0x00 は ELFOSABI_
%readelf - a / bin/ ls | grep OS/ ABI OS/ ABI: UNIX - System V
と表示されるのであった.むー.
さてそれではどうやって Linux のものだと判定すればよいのか,そしてそれはなぜ「0x0114バイトは見ないと判らない」のか,ちょっと調べてみることにした.
調べたのは file コマンド.
%file / bin/ ls / bin/ ls: ELF 32- bit LSB executable, Intel 80386, version 1, for GNU/ Linux 2. 2. 5, dynamically linked (uses shared libs) , stripped
てな感じで Linux だと判定してくれるので,きっと何か手がかりがあるだろう.
というわけで FreeBSD の /
#define GNU_ OS_ LINUX 0 # define GNU_ OS_ HURD 1 # define GNU_ OS_ SOLARIS 2
が定義されている.ちょwww HURD って単語久々にみたわwwwwwwwww
NOTE タイプのプログラムヘッダがどこにあるかというと,
%readelf - a / bin/ ls (略) Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align (略) NOTE 0x000108 0x08048108 0x08048108 0x00020 0x00020 R 0x4 (略)
てな感じになっていて,先頭からのオフセット 0x108 バイトのところから始まるらしい.ここから Elf32_
%hexdump - c / bin/ ls | grep ^ 0000110 0000110 001 \ 0 \ 0 \ 0 G N U \ 0 \ 0 \ 0 \ 0 \ 0 002 \ 0 \ 0 \ 0
となる.うーん,なるほど.
ついでに書いとくと,NOTE タイプのプログラムヘッダは必ずしも 0x108 から始まるわけじゃなくて,例えば /
NOTE 0x000094 0x08048094 0x08048094 0x00020 0x00020 R 0x4
なのであった.つまりオフセット 0xa4 (=
%hexdump - c / bin/ rpm | grep ^ 00000a0 00000a0 G N U \ 0 \ 0 \ 0 \ 0 \ 0 002 \ 0 \ 0 \ 0 002 \ 0 \ 0 \ 0
よさげである.
というわけで,どうやら「Linuxで作られたかは0x0114バイトは見ないと判らないはず,この人は『バイナリ萌え』ではない!」という突っ込みもバイナリ萌えとしてはまだツメが甘いようです.うーむ,バイナリアン恐るべし.ついて行けん.
で,最初の話に戻るんですが,これらのファイルってどうして OS/
2012 :
2011 :
2010 :
2009 :
2008 :
2007 :
2006 :
2005 :
2004 :
2003 :
2002 :
2001 :
2000 :
1999 :
1998 :
1997 :
1996 :
最終更新時間:
*
[baby touch]
『あまり使われないのは、システムコールとかの"実装"に依存し... (2007-11-06 21:15:48)