ruby-trunk-changes r33830 - r33839

今日は kosaki さん無双で、主にビルドプロセスというか、セキュリティ対策に関連して gcc のオプションのをいろいろと追加しています。やや目立つのは ruby を PIE としてコンパイルするようになったことでしょうか。

kosaki:r33830 2011-11-25 07:49:51 +0900

configure で gccコンパイラオプションに -Wall を常に付加するようにしています。

svn:r33831 2011-11-25 07:49:54 +0900

version.h の日付更新。

kosaki:r33832 2011-11-25 07:54:39 +0900

configure で FILE 構造体のメンバを調査していたのをやめています。1.8 では Ruby の IO は stdio を利用していたので FILE の内容を意識していた(はず)ですが 1.9 では FILE の中身を直接触ることはなくなっているので不要になっていました。

kosaki:r33833 2011-11-25 07:58:00 +0900

同じく configure で FILE のバッファポインタのメンバを調査するのをやめています。

kosaki:r33834 2011-11-25 08:02:44 +0900

コンパイラオプション -Wmissing-declarations, -Wold-style-definition が指定されていた時に mkmf.rb が生成するソースコードが警告を出力しないように関数の定義スタイルや宣言の追加をしています。 [ruby-core:40200] [Bug #5459]

kosaki:r33835 2011-11-25 08:04:35 +0900

configure で gcc のオプションに -D_FORTIFY_SOURCE=2 を追加するようにしています。prinf() などのフォーマット文字列と引数の対応のチェックを行なうようになるそうです。

kosaki:r33836 2011-11-25 08:06:26 +0900

同じく configure で gcc のオプションに -fstack-protector を付けるようにしています。これはローカル変数の配列などの操作でオーバフローを起こして関数のリターンアドレスを書き変えてしまう現象を防ぐための措置を入れるようになるそうです。 参考URL: http://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c905.html

kosaki:r33837 2011-11-25 08:50:00 +0900

同じく configure で gcc の場合に -fPIE を付けてコンパイルするようにオプションを追加しています。これは位置独立実行体を生成させるためのオプションで、関数のアドレスをランダムに配置できるようにするものです。一連の流れからしてセキュリティ対策目的での追加だろうと思われます。
これはデバッグ時には現象の再現性がなくなったりして困ることもあるのですが、まぁ Linux なら sysctl -w kernel.randomize_va_space=0 とかして無効化してデバッグすればいいでしょうか。あと PIE としてコンパイルすると ruby そのものを共有ライブラリとしてリンクできちゃいますね。これはもしかすると一部の方にはうれしいかも……。

kosaki:r33838 2011-11-25 10:41:59 +0900

これも configure で gcc に "-Xlinker --no-undefined" というオプションが利用可能なら渡すようにしています。またこのオプションの有無を EXTLDFLAGS という定数にセットするように Makefile.in も修正しています。 このオプションはリンカへ --no-undefined オプションを渡すように指示するもので、--no-undefined は 「通常、非シンボル的共有ライブラリを作る時は、未定義シンボルが許され、残ったものは実行時ローダにより解決される。これらのオプションはそのような未定義シンボルを許さない」だそうです。共有ライブラリと実行ファイルの生成の時に渡されていて、これらが他の共有ライブラリに依存した未解決の未定義シンボルを持ったままにならないようにしているようです。 -fPIE をつけるようにしたことからつけるようにしたのでトラブルを防ぐために追加したのでしょうか。

kosaki:r33839 2011-11-25 11:45:50 +0900

r33819 で ioctl(2) の cmd 毎のバッファサイズの取得を _IOC_SIZE() マクロの利用をやめていましたが、 cmd が 0xFFFF0000 のマスクにひっかかる(比較的新しいやつ) か、_IOC_SIZE() の結果がデフォルトのサイズ 256 よりも大きい値を返す時にはその値を利用するようにしています。