BINARY HACKS #20-#22

PICを付ける意味
PICは.rel.dynamicを.textに押し付けるオプションである。
PICをつけなくとも、共有ライブラリを正常に動かすことは可能である。しかし、速度面からPICを付ける必要がある。
PICをつけ{ずに, て}コンパイルしたファイルのELFを見る。TEXTRELはテキストの再配置が必要であること、RELCOUNTは再配置の数を表す。
readelf -d fpic-no-pic.so | egrep ‘TEXTREL|RELCOUNT’
readelf -d fpic-pic.so | egrep ‘TEXTREL|RELCOUNT’
とすると、下ではTEXTRELが見つかり、RELCOUNTが多い。
(テキストの再配置って何?RELCOUNTって何?.rel.dynamicって何?)

statifier
動的リンクが必要な実行ファイルを、必要のない実行ファイルに変換する。
statifiere /usr/bin/php php2
実行してみないと動的リンク先が決められないライブラリを利用している場合は、–set=LD_PRELOAD=”a.so b.so”などとする。
これが必要な状況は、/lib/libnss*.soと、/usr/lib/gconv/*.soである。

gccのGNU拡張
(1) ビルトイン関数
文字列リテラルを出力するだけのprintfはputsに置き換えられるなど。
LD_PRELOADのオーバライドで問題が起きることがあるので、これの状況を知るための関数が用意されている。
(2) アトリビュート
関数やデータの性質を記述し、特別な意味を付加したり、呼び出しの最適化を期待する。
宣言時に
int foo(void) __attribute__((つけたいアトリビュート));
などとする。
(3) ラベルの参照
ラベルを&&をつけることで、関数ポインタとして扱うことが出来る。なお、関数ポインタなので減算加算が可能である。
void *label = &&error;
goto *label;
error:

(これは実際に使ってみないと、何が使えるのかよくわからなそう)

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>