Binary Hacks ─ ハッカー秘伝のテクニック100選


正誤表

Binary Hacks の正誤表です。 見つかった誤りについては、増刷のタイミングで修正していきます。

Hack #5, p. 20
unit
uint
補足表の中の uint が誤って unit となっていました。
Hack #5, p. 23
e_shnumがそのテーブルの中にいくつプログラムヘッダがあるか
e_shnumがそのテーブルの中にいくつセクションヘッダがあるか
補足 プログラムヘッダ→セクションへッダです。
Hack #6, p. 33
共有ライブラリを使っている場合は、その共有ライブラリにのみ問題のコードがあるので共有ライブラリを入れかえるだけで済みます。
共有ライブラリを使っている場合は、その共有ライブラリにのみ問題のコードがあるのであれば共有ライブラリを入れかえるだけで済みます(*1)
脚注1: 共有ライブラリのソースコードの変更が実行バイナリにも変更が及ぶ場合、例えばABIがかわったりマクロやインライン関数等に変更が加わっている場合にはその共有ライブラリを利用しているコードも再コンパイルする必要があります。
補足 共有ライブラリの問題の説明に不備がありました。
Hack #29, p. 106
このとき、シンボル bar はリンカによって隠されるだけなので、 foo() から bar() への呼び出しは PIC コードの流儀に従って、 PLT を経由します。 つまり、シンボルは隠れても関数呼び出しの方法は変わりません。
このとき、シンボル bar はリンカによって隠され、 foo() から bar() への呼び出しは PLT を経由しなくなります。 つまり、シンボルは隠れて、関数呼び出しもダイレクトになります。
補足 バージョンスクリプトで隠しても関数呼び出しはPLT を経由する、 という記述は誤りでした。
Hack #29, p. 108
バージョンスクリプトを使う方法と比べて visibility 属性を使った方法の方が、 高速なコードを生成できます。 visibility がhidden な関数は PLT を経由せずに直接呼び出せるようになります。
バージョンスクリプトを使う方法と比べて visibility 属性を使った方法の方が、 高速なコードを生成できる可能性があります。 コンパイル時に最適化を行う余地が増えるためです。
補足 ひとつ上の誤りと同様です。
Hack #29, p. 108
__attribute__(("default")))
__attribute__(("hidden")))
__attribute__((visibility("default")))
__attribute__((visibility("hidden")))
補足 "default" と "hidden" の周りの visibility(...) が抜けている部分がありました。
Hack #62, p. 231
% cc -shared -fPIC -o hello.o hello.c
% cc -shared -fPIC -o hello.so hello.c
補足 出力ファイル名が間違ってました。 hello.o ではなく hello.so です。
Hack #79, p. 305
   : = "m" (pc));
   : = "m" (p));
補足 変数名が間違っていました。pc ではなく p です。
Hack #89, p. 337
--event=BSQ_CACHE_REFERENCE:100000:0x10f
0x10f はユニットマスクと呼ばれる、
--event=BSQ_CACHE_REFERENCE:100000:0x100
0x100 はユニットマスクと呼ばれる、
補足 ユニットマスクが間違っていました。0x10f ではなく 0x100です。
Hack #89, p. 337
#define NUM 1000
#define NUM 10000
補足 1000回では L2キャッシュミスを起こすには不足していました。

謝辞

以下の方から内容の誤りに関するご指摘いただきました(ご指摘をいただいた順)。 ありがとうございます。


Satoru Takabayashi