前の月 / 次の月 / 最新

swk's log 2007-10

<< 2007-10 >>
SuMoTuWeThFrSa
123456
78910111213
14151617181920
21222324252627
28293031

2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12
2002 : 01 02 03 04 05 06 07 08 09 10 11 12
2001 : 01 02 03 04 05 06 07 08 09 10 11 12
2000 : 01 02 03 04 05 06 07 08 09 10 11 12
1999 : 01 02 03 04 05 06 07 08 09 10 11 12
1998 : 01 02 03 04 05 06 07 08 09 10 11 12
1997 : 01 02 03 04 05 06 07 08 09 10 11 12
1996 : 01 02 03 04 05 06 07 08 09 10 11 12

2007-10-27 Sat

* ELF ファイルが Linux のものであるか否かを知る方法 [tech] 1 user

【追記】さらにその後,「『7f454c46 01010100 00000000 00000000』の時点でelfファイルであることは判るが,Linuxで作られたかは0x0114バイトは見ないと判らないはず,この人は『バイナリ萌え』ではない!」との突っ込みを頂きました.

Robot.Mとの優雅な平日:バイナリ萌え,再び・・・

0xcafebabe の話を知った大学生の頃,危うくバイナリ萌えの暗黒面に落ちそうになったものの,軽うじて生還して今は普通人として暮らしています.


というわけでバイナリ萌えでない私にとっては,上の「Linuxで作られたかは0x0114バイトは見ないと判らない」はすごく不思議だった.だって ELF って 8 バイト目に OS/ABI あるじゃん.で,ELFOSABI_LINUX (= 0x03) って定義されてるじゃん.そこ見ればいいんじゃないの?

…と思って手近にあった Vine Linux に転がっているバイナリを調べてみると,8 バイト目は軒並 0x00 なのであった.0x00 は ELFOSABI_NONE であり ELFOSABI_SYSV である.で,確かに readelf すると

% 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 の /usr/src/contrib/file/readelf.c あたりを眺めてみると,donote() の中で判定しているようだ.ELF のプログラムヘッダのうち NOTE タイプのものを探して,その先頭 Elf32_Nhdr サイズ分 (ただし 32 ビット ELF の場合.定義は file/readelf.h の中で,実際のサイズは 12 バイト) スキップしたところに 'G', 'N', 'U', '\0' という 4 バイトがあることを確認し,その次の 1 バイトを調べている.そこが 0x00 だったら GNU/Linux であるという判定をしているようだ.ちなみにそこに出てくる値としては

#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_Nhdr 分の 12 バイト進んだ 0x114 の,さらに 'G', 'N', 'U', '\0' の分の 4 バイト進んだところ,つまりオフセット 0x118 バイトのところを見るとようやく Linux かどうかがわかる,という仕組みのようだ.実際に見てみると,

% 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 から始まるわけじゃなくて,例えば /bin/rpm なんかは

  NOTE           0x000094 0x08048094 0x08048094 0x00020 0x00020 R   0x4

なのであった.つまりオフセット 0xa4 (= 0x94 + 12 + 4) を見る必要があるってことでいいかな?

% 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/ABI に ELFOSABI_LINUX を使わないんでしょう? 逆に言うと ELFOSABI_LINUX ってどういうときに使われてるんでしょう? 教えて偉い人.

[ コメントを全部見る / コメントを書く] [ TrackBack ( )] [固定リンク]

* [baby touch] 『あまり使われないのは、システムコールとかの"実装"に依存し... (2007-11-06 21:15:48)

2007-10-22 Mon

* 楽チンアダプター [shopping] 1 user

画像

ドライヤーやポットなど、抜き差しの多いプラグに便利なアダプター。ツマミを指先で押すだけで、プラグが簡単に抜けます。力を入れて引っ張る必要がないので、とてもラク。

楽チンアダプター3個セット - 通販のベルメゾンネット

しばらくドライヤーに使ってみているのだけど,思いのほか便利です.

ちなみにこの商品,正しい商品名は「楽に抜けるアダプター」らしい (製品パッケージにはそう印刷されている).普通は 6 個組で,通販で 3 個組を買えるのはベルメゾンだけかな?


つうかベルメゾンって「女性のための総合オンラインショップ」だったのか.男だけど普通に常用しているんですけど….

2007-10-21 Sun

* イソップ寓話 [misc]

あるところに、コンテンツの著作権を管理している利権団体がいました。ある日のこと、著作物の私的利用の範囲に入るかどうか微妙な使い方をしているユーザに使用料を請求してみたら徴収できてしまいました。利権団体はビックリして、さけびました。

「これはすごい! 高い金が取れるぞ!」

利権団体は次の日も、使用料を徴収しました。また次の日も、また次の日も、毎日使用料を徴収して回りました。おかげで貧しかった利権団体はあたらしいビルに住み、おいしいものを食べ、きれいな服を着ることができました。

「おれもずいぶんお金持ちになった。でも、おれよりも大きい家に住み、おれよりも高い服を着ているやつはおおぜいいる。ユーザがもっとたくさんの使用料を払ってくれればいいのだが。・・・まてよ。あのユーザたちはダウンロードしたコンテンツをPCや携帯プレイヤで再生しているにちがいない。そうだ、それを違法ということにすれば、おれはもっと金持ちになれるぞ」

利権団体はそう思って、すぐにユーザによるダウンロードを違法化させました。

でも、使用料など入って来ません。コンテンツの流通は崩壊してしまい、著作者にはお金が入らなくなり、わが国のコンテンツ立国は夢と消えてしまいました。


元ネタは金の卵を産むガチョウ (ガチョウだったりニワトリだったりアヒルだったりするようだけど).このアナロジーはもちろんちっとも新しいものではありません

2007-10-15 Mon

2007-10-14 Sun

* 高専ロボコン東北地区大会 [tech]

NHK 高専ロボコンの東北地区大会が,名取市民体育館で行われました.主審を務めて来ました.ぐったり.

放送前なので詳しくは書きませんが,いろいろありました.ともかく,高専生の皆さんにはおつかれさまとありがとうを言いたいです.

2007-10-10 Wed

* iPod nano のリセット方法 [ipodnano] 1 user

iPod nano で再生しようとした瞬間にフリーズした.

ipodnano/20071009-104943.jpg

ちょっと写真がわかりにくいけど,横にスクロールして再生画面になる途中で固まっている.このまま電源も切れない.ピンか何かをつっこむリセットボタンがあるかなと思って探してみたけど見当たらない.あー,電池切れるまで待つしかないのかなと思って,たまたま新幹線に乗り合わせた同僚の N 先生に見せると

N 「あー,よくあるよね」
かがみ「え,よくあるんですか?」
N 「ちょっと貸してみて」
かがみ「はい…」
N (何かスターソルジャーの無敵モードのような操作をする.iPod nano 再起動)
かがみ 「ちょww なにそれwwwwww」


で,どうやらこういうことのようだ.

1. ホールドスイッチをオンにしてからオフにします(「Hold」にスライドしてから、オフにします)。
2. メニューボタンとセンター(選択)ボタンを同時に 6 〜 10 秒間押したままにして、アップルロゴを表示させます。この手順を繰り返す必要がある場合もあります。

http://docs.info.apple.com/article.html?artnum=61705-ja

フリーズ時にこの操作でリセットできるってことは,こういうロジックが hard wired になっているってことだよね.面白いなあ.来年の期末試験の問題にしようか,とか職業病なこと考えた.

[ コメントを全部見る / コメントを書く] [ TrackBack ( )] [固定リンク]

* [ゆあ] わ〜!!!!直った!!!!ありがとうごさいま〜す!!! (2008-12-27 16:33:25)

* [名無しさん] 直ったああああああああああああああああああありがとーー (2008-09-18 22:19:45)

* [彰] 直りました!!凄い、助かりました!本当にありがとうございました!! (2008-05-12 22:29:18)

* [センキュー] ありがとうございます!!直っちゃった!!すごい!!ありがとーーーー!! (2008-01-05 21:55:13)

* [過多] ありがとう直ったよ! (2007-11-21 23:27:59)

2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12
2002 : 01 02 03 04 05 06 07 08 09 10 11 12
2001 : 01 02 03 04 05 06 07 08 09 10 11 12
2000 : 01 02 03 04 05 06 07 08 09 10 11 12
1999 : 01 02 03 04 05 06 07 08 09 10 11 12
1998 : 01 02 03 04 05 06 07 08 09 10 11 12
1997 : 01 02 03 04 05 06 07 08 09 10 11 12
1996 : 01 02 03 04 05 06 07 08 09 10 11 12

最終更新時間: 2012-02-13 02:02


Shingo W. Kagami - swk(at)kagami.org