crtbegin.oのソースコード

C++に対応するには、スタートアップで_initを呼ばなければなりません。なぜか。
_initは大域変数として宣言されたオブジェクトのコンストラクタを呼びます。そうしなければプログラムの初っぱなで大域変数であるオブジェクトを使えないからです。では_initはどこにあるのか。
調べたところ、_initのエントリはcrti.oにありました。crti.oのソースであるcrti.Sは無事見つかりましたが、ソースを読むと「本体はcrtbeginにある」と書いてあります。ところが、crtbeginのソースがありません。
ネットをあさって古い別アーキテクチャのcrtbeginのソースは見つけました。単にctor_listに羅列してあるコンストラクタを順に読んでいるだけです。
けっきょくcrt*.oは全部リンクしてしまえばいいのですがここで問題が。-nostdlibや-startfilesをオプションにしてリンクをかけるとcrt*.oもリンクされません。明示的にファイル名を指定するとリンクが通っていないと文句を言います。ファイルをおいてあるパスを見るとパス名にgccのバージョン番号があります。これではポータビリティを確保できません。
仕方ないのでソースを持ってきてビルドしようと思ったのですが、ソースがねぇ!
まぁ、なんとかなるか。
追記:
ここのGCC Internals Manualにほしい情報がありそうです。
http://gcc.gnu.org/onlinedocs/