ふと自分の過去を振り返ってみると、人生で一番最初に触ったPCは富士通の「FM-TOWNS」というi386(16MHz)のマシンで、学生時代にx86のハンドアセンブルやコードチューニングにハマッていた時期がありました。そんな私にとってBinary 2.0カンファレンス2005はとても楽しめる内容でした。期待以上に楽しかったです。簡単にカンファレスの概要と感想をレポートします。
追記:まとめのページができたようです。
■ 1. Binary 2.0 時代の到来 - 高林哲
satoru先生による基調講演。なぜ今さらバイナリなのか?
「Binary2.0は高度なWeb2.0サービスの構築に必要不可欠な技術」というのは表向きの説明で・・・
実は「Web2.0についていけない」のが本音。(w
今のうちに新しいバズワードを提唱して「既得権益を確保」しておこうという狙い。
つかみはOK。会場大爆笑の渦でした。
[発表資料]
■ 2. プログラムはなぜ Mona OS で動くか?fork?何それ? - ひげぽんさん
Mona OS とは?
2ch生まれのオープンソースOSで、カーネルはC++で書かれている。
ソースコードも5万行で、他OSよりも圧倒的に短い。オブジェクト指向万歳。
中身はマイクロカーネルっぽくって、バッファオーバーフローありありのノーガードOS。w
ユーザモードで各種サーバ(プロセスサーバ・PE or ELFサーバ・ファイルサーバ)が動作。
ユーザモードでできることはユーザモードで実装し、割り込みまでメッセージベースでやりとりしている。
Hello Worldでも一苦労、OSの中のひとは大変・・・という内容でした。
[発表資料]
Binary2.0 のはてなリングもあるので、興味のある方は是非参加してみてくださいとのこと。
■ 3. Dynamic Programming Language C -- 私は誰? - 浜地慎一郎さん
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+ ランタイムインスペクション - 青笹茂さん(順番入れ替え)
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++と例外キャッチボール - 中村孝史さん(順番入れ替え)
スーツ族?クールビズです 地球にやさしいwoです
g++の例外処理を解明します
でも、キャッチボールはできません(www
gccで一番良く使うオプションは -S です(w
例外処理は何でできてる?
unwind - 超return
type_info - do_catch()メソッド
名前 mangling ルールを覚えて extern
(大爆笑
unwind-SjLj
unwind-dwarf2
DWRF2 デバッグ情報フォーマット
いくつかのレジスタ
オフセット、状態、CFA、リターンアドレス
オフセット計算アドレス
命令セット
→ 実はプログラミング言語?
余談:makefileでクイックソートとかも(すげー)
[発表資料]
■ 6. 実行時自己書き換え佳境 - 首藤一幸さん
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. ハードコアバイナリアンへの道 - 八重樫剛史さん
[下には下がいる]
ユーザランド C/C++/Java/Perl/...
カーネル Assenmbly/C/C++
--------------------------------
ハードウェア VHDL/VerilogHDL
半導体プロセス ???
ゲート、プリップフロップ
バイナリを生で扱う
I/O(実世界)と直接つながっている
ハードウェア記述言語(HDL)で回路を書く
実際にFPGAボードのVGA出力でプレゼンテーション。
しかも世界初のリモートGDBプレゼン(テラスゴス
→ これにはぶったまげました。ハードコアバイナリアン第一号に認定します。w
[発表資料]
■ 8. ライトニングトーク
ここから一人5分間の怒涛の Lightning Talk が開始(時間厳守です)
■ 8-1. Binareal - バイナリファイルの構造と解釈 - 大和正武さん
Etherealにインスパイアされて開発を始めたBinarealの紹介
構造改革前と後(うまいなぁ)
バイナリデータを可視化するためのツール
■ 8-2. いけないお化粧magic(5) - 野首貴嗣 5分
Flashでプレゼン
magicでファイル判定
M$ Office と OpenOffice.org
Namazu と Sary(一部自虐ネタ)
トリビアの紹介などなど
期待以上の内容でとても面白かったです。w
[発表資料]
■ 8-3. livepatch - 概念と技法 - 鵜飼文敏さん
実行中のプロセスにパッチをあてる(CGLの要求仕様のひとつ)
- Pannusプロジェクト
- livepatch
ptrace(2) - 黒魔術のシステムコール
MDFライブラリ
[発表資料]
■ 8-4. 斜め下を行くバイナリ書き換えの探求 - 後藤正徳さん
Linuxに数行のスペシャルパッチを適用すると・・・
実行時バイナリをバイナリエディタで直接書き換えが可能に!w
アイデア勝負ですね。
[発表資料]
■ 8-5. Cache Pollution Aware Patch - よしおかひろたかさん
Miracle Linux の中のひと。
CPUの速度向上(+50%/年)
メモリの速度向上(+7%/年)
L1 < L2 < メモリ
ユーザ空間からのコピー
copy_from_user_ll()
をチューニングすると早くなる
カーネル読書会やってます
[発表資料]
■ 8-6. Inside QEMU - BEROさん
QEMU
複数のターゲット、ホストに対応したエミュレータ
Cによる移植性の高いJITコンパイルをどうやって実現しているか?
TARGET CPUの命令をC言語の関数で実装したものをコンパイル&リンク
→惜しくも時間切れ・・・
[発表資料]
■ 8-7. GNP --- 'g' Network Protocol-Stack (for Boot Loader) - g新部裕さん
m32r-g00ffに実装したプロトコルスタックの話のはずだったけど・・・
Binary 2.0カンファレンスのドレスコードは「ブラックandホワイト」だったらしい(w
しかもバイナリアンだったら指折りは2進法で数を数えますよね?って(www
次回は「Binary 2.0 カンファレンス MaxHeart」と改名して、ドレスコードは「ブラックandホワイト」に新しく「ピンク」を加えてみましょう。:-)
それでは、みなさん、Happy hacking!