メイン

2009年04月21日

[Debug Hacks] #66.手元のx86マシンが64bitモード対応かどうかを調べる

本日オライリージャパン様より「Debug Hacks――デバッグを極めるテクニック&ツール」の献本をいただきました。著者の皆様、出版社の皆様ありがとうございます。

とりあえず、ざっくりと気になる章だけをかいつまんで読んでみたのですが、最後の章「#66.手元のx86マシンが64bitモード対応かどうかを調べる」では、/proc/cpuinfo で lm の文字列を探す方法と、以下のような CPUID 命令を発行して今自分が使っているマシンのCPUが64bitに対応しているかどうかを調べるハックが紹介されていました。

#include <stdio.h>

void cpuid(int op, unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx) {
  __asm__("cpuid" : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) : "0" (op));
}


int main() {
  unsigned int eax, ebx, ecx, edx;
  cpuid(0x80000000, &eax, &ebx, &ecx, &edx);
  if (eax < 0x80000001) return 0;
  cpuid(0x80000001, &eax, &ebx, &ecx, &edx);
  if (!((1<<29) & edx)) return 0;
  printf("64bit Long mode is supported.\n");
  return 1;
}

ただし、このハックの問題点は、CPUが64bitをサポートしているかどうかだけをチェックしていて、実際に64bitロングモードか32bitのx86互換モードで動いているかどうかを検出できないことにあります。

そこで、現在のCPUが64bitロングモードで動作しているかどうかをチェックする簡単なPerlスクリプトを書いてみました。

#!/usr/bin/perl

use DynaLoader;

sub x86_sub {
	my ($func, $x86) = @_;
	if ($^O eq "linux") {
		require 'syscall.ph';
		syscall(&SYS_mprotect,(unpack"L",pack"P",$x86)&~4095,4096*2,7);
	}
	DynaLoader::dl_install_xsub(caller(0)."::$func",unpack"L",pack"P",$x86);
}

x86_sub check64bit => do {
	our $LM64bit = "?";

	"\xb8\x31\x00\x00\x00".    # mov eax, 0x31

	"\x48".                    # dec eax // 64bit REX PREFIX
	"\xa2".pack("P",$LM64bit). # mov [$LM64bit], al
	"\xc3";                    # ret

};

&check64bit();

warn $LM64bit; # "0" => 32bit, "1" => 64bit

これは、DynaLoader::dl_install_xsubでx86の機械語を直接実行させるサブルーチンを定義して、64bitロングモード特有のREX PREFIXを解釈するかどうかで判別している方法になります。32bitのx86互換モードでは dec eax が実行され $LM64bit='0' となりますが、64bitロングモードではこのような1byte decは解釈されず、直後のmov命令のREX PREFIXを指定することになるので、$LM64bit='1' となります。

したがって、x86_64対応の「Intel(R) Xeon(R) CPU E5430 @ 2.66GHz」が搭載されているマシンでもCentOS 5.2(i386)のような64bitに対応していないOSで動かしてしまっている場合は、32bitと判定されます。

本Hackはデバッグには関係ありませんが、普段スクリプト言語を書いておられる方にも興味を持っていただければ幸いです。

2008年11月11日

/. Happy Binary Day ! /.

スラッシュドットJPによると、本日11月11日はバイナリデーだそうです。

バイナリデーを祝うべく、/.Jにもちょっとしたイースターエッグを仕込んでおきました。 /.Jのとある場所に、日本のバイナリ/ハッカー界の著名人の方々から頂戴した祝賀 コメントを掲載しています。/.J読者皆様、ぜひお探しの上一緒にバイナリデーを お祝いいただけるとうれしいです。

とのことで、小生も 祝賀コメントとネタのバイナリファイルを寄稿いたしました。

※ 11/12 8:22 追記 時効ということでイースターエッグのURLを直リンしました

■ 0x457.html (0x457 = 1111)

HTML EBCDIC JavaScript Linux ELF x86 Golf Polyglot です。

0x457.html

(1) Safari3 で表示した結果

Safari3

(2) IE7 で表示した結果 (IE6では表示できません)

1111ie7.png

例のファイルですが、 Safari3 と IE7 で動作確認しています。Firefox, Opera では動作しません。

(3) Linux ELF x86 として実行した場合

1111x86.png

Linux ELF x86 は CentOS release 4.7 (Linux 2.6.9-55.0.12.EL i686 i386 GNU/Linux) で 動作確認しています。最近の x86_64 の環境だと動作しないかもしれません。

(4) VT100端末で表示した場合

1111vt100.png

どうぞご利用ください。

種明かしはのちほど。

2007年11月05日

Real UNIX MAGAZINE Day ライトニングトーク

先日のshibuya.jsに引き続き、 Real UNIX MAGAZINE Day に参加してきました。

Real UNIX MAGAZINE Day

以前のプレゼンと重なる部分がありますが、若輩者ながら、昨今のAjaxの技術のGIF89a(ハック)について newtype と oldtype の話を交えながら、ライトニングトークさせていただきました。

前日のshibuya.jsと変わって参加者の年齢層が大きく異なっていたのが面白かったです。

  • newtype : shibuya.js の参加者層(18才~30才前後がメイン)
  • oldtype : Real UNIX MAGAZINE Day参加者層(和田先生は1931年生まれ)

oldtypeの皆様にも満足いただけたようで、少し安心しました。

あと、参加者の皆さんが持ち寄って展示されていたビンテージコーナーは初めて見るものばかりで圧巻でした。

VAXマニュアル コンピュータ用紙テープ UNIX配布MT 初代Dynabook 8進法ソロバン HHKプロトタイプ(サイン入り) NeXT Computer マザーボード iPhoneのおばあちゃん SONY Σ STATION SONY Σ STATION SONY NEWS SONY NEWS Perl T-shirts SUID特許 IBM6100RT/PC ROMP CPU PB031547 X11R3 配布テープ あみだくじ

みなさんは、どれだけわかります?

ちなみに、i-revoさんが中継に使用している機材って、(会社のじゃなくって)全部スタッフの個人の趣味で所有している物だと聞いてびっくりしました。

i-revoさんの中継機材(個人) i-revoさんの中継機材(個人) i-revoさんの中継機材(個人) i-revoさんの中継機材(個人) i-revoさんの中継機材(個人)

すごいですね。IIJさん、i-revoさん、いつもありがとうございます。

2007年05月15日

連載企画 FizzBuzz ではじめる Code Golf (x86 32bit) 入門

Code Golf とは? Matzにっき(2006-10-05) より

ゴルフとは如何に少ないストロークでホールインするかを競う競技である。 コードゴルフとは、如何に少ないキーストローク(バイト数)で、プログラムを実装できるかを競う競技である。

先日FizzBuzz.com (MS-DOS 16bit版) を作ってみたら、32bit版のプログラムにも挑戦したくなりましたので、x86 32bitで命令長を減らすテクニックについて紹介したいと思います。

※まずはコード長の比較のみで実行クロック数は競わないことにします。

■ x86 32bit コード最適化

【問題】EBXレジスタに1を、EAXレジスタに4を代入したい

できるだけ短いバイト数でコードを実現するためには、いろいろなx86命令をフル活用することを考えます。

自分の思いついた解答をNASMの記法で書いてみます。

続きを読む "連載企画 FizzBuzz ではじめる Code Golf (x86 32bit) 入門" »

2007年05月10日

FizzBuzz x86 for バイナリアン

昨日の続き。今日は息抜きに FizzBuzz.com (MS-DOS 16bit版) を作ってみました。

0000000 b4 02 bb 31 30 30 ed e8 2c 00 e8 29 00 e8 39 00 
0000020 e8 23 00 e8 3e 00 e8 30 00 e8 1a 00 e8 17 00 e8 
0000040 27 00 e8 2f 00 e8 0e 00 e8 1e 00 e8 08 00 e8 05 
0000060 00 e8 13 00 eb d1 80 ff 30 74 04 88 fa cd 21 88 
0000100 da cd 21 e8 28 00 c3 fe c5 b2 46 cd 21 b2 69 cd 
0000120 21 e9 08 00 b2 42 cd 21 b2 75 cd 21 b2 7a cd 21 
0000140 cd 21 84 ed 75 04 e8 05 00 c3 30 ed eb e6 b2 0d 
0000160 cd 21 b2 0a cd 21 fe c3 80 fb 3a 75 09 b3 30 fe 
0000200 c7 80 ff 3a 74 01 c3 b8 00 4c cd 21 
0000214 

これで140byte

続きを読む "FizzBuzz x86 for バイナリアン" »

2006年12月20日

Web2.0時代のAjax Binary Hacks

遅くなりましたが、Binary 2.0 カンファレンス2006 で発表した資料を公開しました。

※公開用にいくつか手を加えてあります

前フリが長いとのツッコミがありましたので、今回の発表内容を少し要約してみたいと思います。

1. GIF Format Hacks (Server side)

まずは、任意のpixelサイズ(幅・高さ)を持った画像ファイルを固定長の35byteで出力する方法

#!/usr/bin/perl
use strict;
use warnings;

sub create_gif {
  my $size = pack "S2", @_;
  return "GIF89a$size\xf0\x00\x00\x00\x00\x00\xff\xff\xff,"
  . "\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02L\x01\x00;";
}

print "Content-Length: 35\n";
print "Content-Type: image/gif\n\n";
binmode(*STDOUT);
print create_gif(65535, 65535);

1;

この画像フォーマットを利用すると、任意のサイズ(幅・高さ)を持ったGIF画像をサーバサイドで出力することができます。

実際に作った 65535 x 65535 pixel の 35 byte GIF画像ファイルですが
http://namazu.org/~takesako/slides/65535x65535.gif
Webブラウザのレンダリングに大量のメモリを消費することはありません。

2. Ajax Hacks (Client side)

このテクニックは Binary Hacks の献本をいただけなかった人から教えてもらったのですが、 サイズを指定しないImageオブジェクトに対して、JavaScriptのonloadのタイミングで画像のwidth属性を読み込むことができます。

<img src="null.gif" onload="alert(this.width)">

これを応用すると、WebブラウザのJavaScriptから非同期リクエストを飛ばして、サーバからの結果を画像のwidth属性から読み取れます。

function callback(data) {
  // ...ここにコールバックの処理を書く...
}

var img = new Image;
img.onload = function(){callback(img.width)};
setTimeout(function(){img.src='http://example.com/null.gif?q=hoge'}, 0);

/*
<img src="http://example.com/null.gif?q=hoge" onload="callback(this.width)">
*/

これはすごい

ということで、究極のJavaScript非同期クロスドメインAPIとして、 クロスドメイン越えができる非同期リクエストをJavaScriptから簡単に飛ばせる、 というテクニックでした。

# 一度に 16bit x 2 (width, height) のデータしか返せませんけど...いろいろ応用できると思います


簡単なデモは ここをクリック


以上、全面的にmalaリスペクトでお届けしました。


お詫び (2006.12.25 追記)

Web2.0時代のAjax Binary Hacks で公開した資料の中に 一部不適切な画像がありましたので、削除いたしました。

2006年11月09日

Binary Hacks と 64bit popCount 問題

各所レポートが挙がっている通り、私の手元にも Binary Hacks の献本が届きました!

表紙
Binary Hacks サポートページ
書名 Binary Hacks
サブタイトルハッカー秘伝のテクニック100選
著者 高林哲, 鵜飼文敏, 佐藤祐介, 浜地慎一郎, 首藤一幸
出版社オライリー・ジャパン
定価3,360円 (税込)
ページ数412ページ
ISBN4-87311-288-5
発売日2006年11月11日
版型A5

高林さん、オライリーさん、ありがとうございます。

ちなみにetoさん情報によると、明日11/10は「いいバイナリの日」らしいです。

  • 11 → いい
  • 10 → バイナリ

Binary Hacks の発売日は 11/11 で、ビットが全部立っている非常に縁起の良い日です。

縁起を担ぐためにも、いいバイナリの日に Binary Hacks を注文して、発売日に書店に行って本を見かけたら 11 冊買いましょう。

x86 パフォーマンスチューニング

さて、最後の HACK #100「文献案内」でマイクロプロセッサアーキテクチャマニュアルが紹介されていましたが、 x86のパフォーマンスチューニングつながりということで、 ちょうど今日ラボの社内掲示板で盛り上がった話題をこちらでも共有したいと思います。

* popCount 問題

64bitの数値の中で1になっているビット数を数える

popCount64bitA

unsigned long long popCount64bitA(unsigned long long x) 
{ 
    int n = 0; 
    n += popTable[x & 0xff]; 
    n += popTable[(x >> 8) & 0xff]; 
    n += popTable[(x >> 16) & 0xff]; 
    n += popTable[(x >> 24) & 0xff]; 
    n += popTable[(x >> 32) & 0xff]; 
    n += popTable[(x >> 40) & 0xff]; 
    n += popTable[(x >> 48) & 0xff]; 
    n += popTable[(x >> 56) & 0xff]; 
    return n; 
} 

popCount64bitB

unsigned long long popCount64bitB(unsigned long long x) 
{ 
    x = ((x & 0xaaaaaaaaaaaaaaaaUL) >> 1) 
      +  (x & 0x5555555555555555UL); 
    x = ((x & 0xccccccccccccccccUL) >> 2) 
      +  (x & 0x3333333333333333UL); 
    x = ((x & 0xf0f0f0f0f0f0f0f0UL) >> 4) 
      +  (x & 0x0f0f0f0f0f0f0f0fUL); 
    x = ((x & 0xff00ff00ff00ff00UL) >> 8) 
      +  (x & 0x00ff00ff00ff00ffUL); 
    x = ((x & 0xffff0000ffff0000UL) >> 16) 
      +  (x & 0x0000ffff0000ffffUL); 
    x = ((x & 0xffffffff00000000UL) >> 32) 
      +  (x & 0x00000000ffffffffUL); 
    return x; 
} 

→ どちらが速いか?

続きを読む "Binary Hacks と 64bit popCount 問題" »

2006年09月12日

Development Environment Conference 報告

事前登録開始から最速4分で締め切られたという超人気カンファレンス Development Environment Conference (通称:DECON) に行ってきました。無理やり日本語に訳すと「開発環境会議」ということで、Eclipse とか VisualStudio とかの話を期待していた人は完全にスルーでした。本当にありがとうございました。スピーカー陣の構成からしてそのような話を期待していた人はいなかったと思いますけど。

ということで、DECONの各セッションで印象に残った点や感想をまとめてみました。

Development Environment Conference 準備中

はてなと私の開発環境(伊藤直也)

会社では半分以上がプログラマ(21人中12人)で、11人がPerl使いで、1人がRuby厨。終始id:secondlife氏がネタにされていました。id:higepon氏はUbuntu Linuxを使っていて、その他の人は Windows coLinux/vmware もしくは MacOSX を使ってローカルで開発している。エディタは大半の人がEmacsを使っていて、vimは少数派。シェルは zsh、バージョン管理は subversion と Switchtower (Capistrano) を使っているとのこと。

bash, CVS は小学生までらしいです。

GNU screen + zsh でコマンド履歴を共有。さらに screen な環境で ssh-agent。はてなのサーバはたくさん(250台以上)あるので、LDAP + NFS + keychain で他のサーバに簡単にログインできるの環境を構築している。

さらに便利な小粒ツールとして紹介していた perlsh。Ruby でいう irb の Perl版みたいなもの。しかし、perlsh のデモで 1 * 5 を打つのはどう見ても小学生だと思いました。ほんとうに(ry

[まとめ]
GI○AZINEはそろそろ痛烈にDIS(ry

Agile Web Development with 萌ディタ Reloaded(mala)

・28%ルール
・Alpha vs. 萌ディタ
・半透明82%でIRC
・それWEBrickでできるよ
・それAutoHotkeyでできるよ
・JavaScriptのデバッグは alert debug
 - alert_once
 - window.status debug
 - document.title debu

[まとめ]
ライブドアデパートで売ってるショートカットキー専用のキーボードがお買い得
今なら5500円

Windows Environment & Vim(secondlife)

ジョーバでダイエット(7万円もした)
M+BITMAP FONTS ビットマップフォント好き
Windowsならgvimがお勧め(グラフィカルで高速)

[まとめ]
Shibuya.vim 開催したい!

Binary Hacks in Action(高林哲)

straceで深追い
gccを追いかける
gdbアタッチの応用
gdbでアタッチしてcall chadir(...)でOK
call setvbuf(stdout,0,2,0)
objdump

[まとめ]
オライリーから Binary Hacks 本が出るよ!

Hacking Vox and Plagger(宮川達彦)

CentOS on Xen で開発
rpm + mantle(独自インフラパッケージ)
CPAN::Mini で minicpan
svk pull して svk push

[まとめ]
svnは小学生まで。svkを使おう!ack便利!

オレポータビリティ(青木峰郎)

自宅に TRUE64UNIX Tru64 UNIX や AIX の環境がある!
俺のポータビリティを高めるためには?

[戦略]

(1) 必須ソフトウェアを限界まで削る
  vi大好き、bashでも気にしない
(2) カスタマイズしない
  No Configuration is Good Configuration
(3) ホームディレクトリの構成は全マシンで共通化する
  Convention over Configuration
(4) 徹底的にバージョン管理
  副作用として共有

[まとめ]
あたりまえのことを徹底的にやるのがポイント
キーボードのテンキーを鋸でぶった切る

私は未だに vim じゃなくって nvi-m17n を使っている old type なので、カンファレンスの内容は大変参考になりました。スピーカーの皆さん、どうもありがとうございました。

2006年01月10日

C-0.02 バージョンアップ

Kazuho@Cybozu Labs: C-0.02

C-0.02 をリリースします。... このバージョンでは、以下のような機能が追加になりました。 -m オプション: デバッガのサポート: man の追加: #option ディレクティブ ...

ということで、RPMパッケージを更新しました。

Red Hat系Linuxならバージョンアップ一発です。

# rpm -Uvh http://takesako.31tools.com/redhat/RPMS/noarch/C-0.02-0.noarch.rpm

ちなみに、Plamo Linux/Slackware なら rpm2tgz した後に installpkg でインストール
Debian GNU/Linux なら alien で .deb パッケージに変換してインストールすることができるみたいです。

将来のバージョンではコンパイル結果のキャッシングとかができるようになると理想ですね。

■追記(C-0.03 バージョンアップしました)

それでは have fun !

2006年01月06日

#!/usr/bin/C でワンライナーを書く

Kazuho@Cybozu Labs: C - a pseudo-interpreter of the C programming language

 Perl や Ruby では、ワンライナーで処理が書けて便利です。でも、なぜか C では書くことができません。仕事上の都合で、小さな処理を C 言語で書く必要があったので、ワンライナーも書くことのできる C 言語のインタプリタ(?)を作ってみました。

面白そうなので、早速RPMパッケージを作ってみました。

Red Hat系Linuxならインストールは以下のコマンド一発です。

# rpm -ivh http://takesako.31tools.com/redhat/RPMS/noarch/C-0.01-0.noarch.rpm

こんなことができるようになります。

[1] C言語でワンライナー:

C -e 'printf("hello world\n");'

[2] shebangでスクリプト実行:

#!/usr/bin/C
printf("hello world\n");

処理させる内容によってはPerlの約100倍早く動作することもあるようです。

半分ジョークプログラムみたいですが、いや、これ、実は結構便利かも。。。

続きを読む "#!/usr/bin/C でワンライナーを書く" »

2005年12月03日

Binary2.0カンファレンス2005に行ってきました。

ふと自分の過去を振り返ってみると、人生で一番最初に触ったPCは富士通の「FM-TOWNS」というi386(16MHz)のマシンで、学生時代にx86のハンドアセンブルやコードチューニングにハマッていた時期がありました。そんな私にとってBinary 2.0カンファレンス2005はとても楽しめる内容でした。期待以上に楽しかったです。簡単にカンファレスの概要と感想をレポートします。

追記:まとめのページができたようです。


■ 1. Binary 2.0 時代の到来 - 高林哲

binary1keynote.jpg

satoru先生による基調講演。なぜ今さらバイナリなのか?

「Binary2.0は高度なWeb2.0サービスの構築に必要不可欠な技術」というのは表向きの説明で・・・
実は「Web2.0についていけない」のが本音。(w
今のうちに新しいバズワードを提唱して「既得権益を確保」しておこうという狙い。
つかみはOK。会場大爆笑の渦でした。

[発表資料]


■ 2. プログラムはなぜ Mona OS で動くか?fork?何それ? - ひげぽんさん

binary2mona.jpg

Mona OS とは?

2ch生まれのオープンソースOSで、カーネルはC++で書かれている。
ソースコードも5万行で、他OSよりも圧倒的に短い。オブジェクト指向万歳。
中身はマイクロカーネルっぽくって、バッファオーバーフローありありのノーガードOS。w

ユーザモードで各種サーバ(プロセスサーバ・PE or ELFサーバ・ファイルサーバ)が動作。
ユーザモードでできることはユーザモードで実装し、割り込みまでメッセージベースでやりとりしている。
Hello Worldでも一苦労、OSの中のひとは大変・・・という内容でした。

[発表資料]

Binary2.0 のはてなリングもあるので、興味のある方は是非参加してみてくださいとのこと。


■ 3. Dynamic Programming Language C -- 私は誰? - 浜地慎一郎さん

binary3shinh.jpg

SDLプレゼンテーションシステム(SPS)によるプレゼン。

嫌いなもの
- 似たコードの連続

解決方法
- スクリプトでコード生成
 ダサいよね
 生成してからコードを再編集するとイヤなことに
- C/C++のマクロ
 CppUnitとか
 少しマシになっただけ
そうだリフレクションだ
でもCには・・・リフレクションがない
 Javaを使う→(自分にとっては)論外www

道のり

* which $0
 私は誰?
 実行しているEXEを取得
 環境依存、#ifdefの嵐、バッドノウハウの山
 ライブラリ化したい(グッドラッパーを目指す)

* ldd
 ロードされているDLLを取得

* nm
 オブジェクトファイルを見てシンボルを取ってくる
 080xxxxxxx T bfd_make_readable とか

* libbfdで関数アドレスを取得
 GNU binutilsのライブラリ
 オブジェクトファイルを読み書きできる
 多数の対応フォーマット

* c++filt
 C++のシンボルは読めない
 デマングル(w

* 取得した関数のcall
 関数のシグネチャが決まっていれば簡単
 わかっていない場合
 - libffi
  GCJで利用されている
  動的ディスパッチが可能
 - ffall
  GNUStepで利用されている

JavaやRubyなどと比較すると・・・
 可搬性にやや難
 わかりにくいエラーメッセージ(w
 言語に統合されていない
 構造体メンバが見れない

いいところ
 楽しい!

[活用事例]

しー言語(言語というよりかバッチに近い)
#!./she
puts "hello world!"
!load "m"
dx = cos 3.2
printf "%f" dx

Dynamic Test Runner
 .o ファイルをロード・再配置
 内部の dtr_test を含む関数をかたっぱしから実行

Ruby/C++ Ruby/D ちょっと作ってみた
 RubyからC++のクラスを直に、SWIGは面倒
 Objective-C++、Java & Groovy みたいに
 バインディング不要

[言いたかったこと]

コピペでコード書きたくない!(笑)

[発表資料]


■ 4. G-Inspector -- GTK+ ランタイムインスペクション - 青笹茂さん(順番入れ替え)

binary4ginspector.jpg

GTK+はメジャーな言語をサポート
 Ada、Eiffel、Haskell、SmallTalkって・・・(テラワロス

typedef、マクロ、データ構造、リスト、
バイナリツリー、イテレータ、
イベントループ、フレームワーク、抽象化したI/O

GObject
- GTK+の肝
- C言語でオブジェクト指向するためのフレームワーク

ここに実行バイナリがあります
 stripされてる
 ソースもない
そこで G-Inspector の登場!
- editresみたいなもの
- オブジェクト一覧
- 実行中にプロパティを変更
- ウィジェットツリーをシリアライズ(XMLとか)
- メモリ領域をダンプ

* ついでに GNU Autotools のクイックツアー

Autoconf/Automake/Libtool/pkg-config

個人的にはバッドなノウハウがとても一杯の感覚が抜けないんだけど、最近は

configure.ac
Makefile.am
{name}.pc

の3つのファイルを書くだけでいけるようになったらしい。
pkg-config は知らなかったので今度から使ってみよう。


■ 5. g++と例外キャッチボール - 中村孝史さん(順番入れ替え)

binary5dwrf2.jpg

スーツ族?クールビズです 地球にやさしいwoです

g++の例外処理を解明します
でも、キャッチボールはできません(www

gccで一番良く使うオプションは -S です(w

例外処理は何でできてる?
 unwind - 超return
 type_info - do_catch()メソッド

名前 mangling ルールを覚えて extern
(大爆笑

unwind-SjLj
unwind-dwarf2

DWRF2 デバッグ情報フォーマット
 いくつかのレジスタ
 オフセット、状態、CFA、リターンアドレス
 オフセット計算アドレス
 命令セット
→ 実はプログラミング言語?

余談:makefileでクイックソートとかも(すげー)

[発表資料]


■ 6. 実行時自己書き換え佳境 - 首藤一幸さん

binary6corewars.jpg

Core Wars知ってますか?(私ははじめて知りました)

マルチスレッドなプログラム
 実行の流れ(スレッド)が複数あって、メモリ空間を共有する。
 これってリアル Core Wars ですか?

なんで自己書き換えなんかするの?
- HotSpot VM (SunのJava仮想マシン)
 アプリのスレッドを任意の箇所で停止させるために、
 ソフトウェア割り込み命令を上書きする。
 後で元のコードを書き戻す。
 ガベージコレクションやOn-stack replacementが目的。
- IBMのJava仮想マシン (by IBM東京基礎研)
 バッドなノウハウ満載
- shuJIT (x86用 Java JITコンパイラ)
 クラスの初期化
 インスタンス生成時の諸チェック
 Interface実行時のチェック・・・

Core Wars のテクニックを利用して:
   nop
   nop
   初回実行時のみの処理
   nop を jump done に書き換え
done:

x86でプログラムカウンタを読む小技

他のスレッドを妨害しないために
Atomicに書き換える
 x86だとXCHG命令など
ロック
 モニタ、セマフォ
 一時停止

 EB FE をアトミックに書き込む
 他のスレッドはループして待機

[発表資料]


■ 7. ハードコアバイナリアンへの道 - 八重樫剛史さん

binary7hardcore.jpg

[下には下がいる]

ユーザランド C/C++/Java/Perl/...
カーネル Assenmbly/C/C++
--------------------------------
ハードウェア VHDL/VerilogHDL
半導体プロセス ???

ゲート、プリップフロップ
バイナリを生で扱う
I/O(実世界)と直接つながっている

ハードウェア記述言語(HDL)で回路を書く

実際にFPGAボードのVGA出力でプレゼンテーション。
しかも世界初のリモートGDBプレゼン(テラスゴス
→ これにはぶったまげました。ハードコアバイナリアン第一号に認定します。w

[発表資料]


■ 8. ライトニングトーク

binary8lightningtalk.jpg

ここから一人5分間の怒涛の Lightning Talk が開始(時間厳守です)


■ 8-1. Binareal - バイナリファイルの構造と解釈 - 大和正武さん

binary81binareal.jpg

Etherealにインスパイアされて開発を始めたBinarealの紹介
構造改革前と後(うまいなぁ)
バイナリデータを可視化するためのツール


■ 8-2. いけないお化粧magic(5) - 野首貴嗣 5分

binary82magic.jpg

Flashでプレゼン
magicでファイル判定
 M$ Office と OpenOffice.org
 Namazu と Sary(一部自虐ネタ)
トリビアの紹介などなど
期待以上の内容でとても面白かったです。w

[発表資料]


■ 8-3. livepatch - 概念と技法 - 鵜飼文敏さん

binary83livepatch.jpg

実行中のプロセスにパッチをあてる(CGLの要求仕様のひとつ)
- Pannusプロジェクト
- livepatch

ptrace(2) - 黒魔術のシステムコール
MDFライブラリ

[発表資料]


■ 8-4. 斜め下を行くバイナリ書き換えの探求 - 後藤正徳さん

binary84binedit.jpg

Linuxに数行のスペシャルパッチを適用すると・・・
実行時バイナリをバイナリエディタで直接書き換えが可能に!w
アイデア勝負ですね。

[発表資料]


■ 8-5. Cache Pollution Aware Patch - よしおかひろたかさん

binary85cache.jpg

Miracle Linux の中のひと。

CPUの速度向上(+50%/年)
メモリの速度向上(+7%/年)

L1 < L2 < メモリ

ユーザ空間からのコピー
copy_from_user_ll()
をチューニングすると早くなる

カーネル読書会やってます

[発表資料]


■ 8-6. Inside QEMU - BEROさん

binary86qemu.jpg

QEMU
 複数のターゲット、ホストに対応したエミュレータ
Cによる移植性の高いJITコンパイルをどうやって実現しているか?
 TARGET CPUの命令をC言語の関数で実装したものをコンパイル&リンク
→惜しくも時間切れ・・・

[発表資料]


■ 8-7. GNP --- 'g' Network Protocol-Stack (for Boot Loader) - g新部裕さん

binary87gnp.jpg

m32r-g00ffに実装したプロトコルスタックの話のはずだったけど・・・
Binary 2.0カンファレンスのドレスコードは「ブラックandホワイト」だったらしい(w
しかもバイナリアンだったら指折りは2進法で数を数えますよね?って(www


次回は「Binary 2.0 カンファレンス MaxHeart」と改名して、ドレスコードは「ブラックandホワイト」に新しく「ピンク」を加えてみましょう。:-)


それでは、みなさん、Happy hacking!