ToDo:
bss を munmap ってしていいんだなあと知った。
といいますのは。
GCC のプリコンパイルドヘッダというのは、 どうも割と正気の沙汰じゃない実装がなされていて、 たぶん内部状態をそのままダンプしたようなものになってるんだと思う。
そのままってのはたぶん割とガチにそのままで、 ポインタのアドレスとかがたぶんそれなりに入ってる。 少なくとも前チラ見した時に gcc バイナリ内の関数へのポインタとかが そのまま入ってはいたという記憶がある。
そんなわけだから、 cc1 は自分自身の checksum を知っていて、
% gcc -xc -v /dev/null 2>&1 | grep checksum Compiler executable checksum: d0509cacf8e2dc8d8d001fecf2ae324f
などとすると出てきたりする。 この checksum は cc1 自身っていうか cc1 の材料全部の checksum 、 って感じぽいが。
で gcc のプリコンパイルドヘッダはこの checksum を 先頭の方に入れておいて、 コンパイラが違う場合は絶対にプリコンパイルドヘッダが使われないように気をつかっている。
で、そいうことするとたぶん色々とアドレスの固定なんざをしなければならないようで、 実際それを頑張ってるのを見つけたのが最初に書いたコレ。
http://opensource.apple.com/source/gcc/gcc-5666.3/gcc/config/host-darwin.c
char pch_address_space[1GB] とかいう巨大な配列を作っておいて、 いらない部分は munmap 、って方法で固定の空間を作ってるみたい。 すごい話だなぁ。
linux の方は、 address randomization あっても 16MB 以上はズレないから、 32MB mmap してからその次で mmap して手に入れたアドレスは、 アドレス指定 mmap でゲットしやすいんじゃね? とかいう実装。
http://opensource.apple.com/source/gcc/gcc-5666.3/gcc/config/host-linux.c
パフォーマンスのためなんだろうけど、 GCC のプリコンパイルドヘッダはいつチラ見してもすごい…
(22:55)
前 | 2011年 12月 |
次 | ||||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。
http://cpplover.blogspot.com/2009/11/windows-7.html
Visual C++もやっぱりがんばっていて、こっちはWindows 7のaddress randomization下で動くよう、アドレス固定を諦めて実装し直したとか。
おお、 VC も同じような感じなんですね。パフォーマンス考えるとそうなっちゃうんですかね…