Ada Hackathonを本当にやる会

ということでWiki置いてみました。どなたでも構いませんので賛同していただける方は適当に記名/加筆してください。(具体的な案はまだ一切無い妄想レベルです……)

http://panathenaia.halfmoon.jp/alang/ada-hackathon/wiki/

それにしてもFSWiki手強すぎる。編集しても反映されないので適当にdie埋め込んでトレースしてみたら、save_beforeの呼び出しから返ってきていないことが判明。FAQにも症例無し。とりあえずsave_beforeを使っているプラグインは無さげでしたのでコメントアウトして動かしました。Perlわからんです。Perlが使われるのって、言語がいいからではもう断じてなくて、やっぱりキラーアプリケーションとして大量の良いCGIがあるからだと思うのですよ。D言語の普及にはやっぱりDikiの存在が一役買ってると思うのですよ。Modula-3ですらCVSupをコンパイルするためにディストリビューションに入ったりしているわけですし。AdaでCGIって結構幸せです。事前にコンパイルするためサーバー環境に左右されにくいですし、生成コードにも大量のランタイムチェックが埋め込まれますのでPerlよりずっとデバッグが楽です。……と思うのですが、軽く探してもAdaで書かれたWikiは存在している様子が無く……。とまあ己の不甲斐なさを棚に上げてみる。FSWikiの設置で2日も使ってしまうぐらいならとっととどっか借りれば良かったorz

3.11ではflexlinkが必須になっていました

ocamlmklibもWindows版に付いてきてますし、使用できるライブラリが増えるといいですね。
……などとわくわくしてたら、ちょっと大き目の.oで早速引っかかってしまいました。
flexlinkのソースのcoff.ml

    if (int32 buf 36 &&& 0x01000000l <> 0l)
    then (Printf.printf "More relocs!\n"; assert false);

COFFのセクションヘッダーのオフセット+39って、メモリのページ数ですよね……。4K単位のやつ。
flexlinkはページ数が奇数のセクションを扱えない!?でもこのチェックを消したらきちんと動く.exeを作ることができましたし。
"More relocs!"を信じようと思っても、COFF1はリロケーションが必要なエントリ数を記録するところは2バイトですので単なるオフセット値間違いとも思えませんし……。なんでしょう?
binutilsのソースと見比べると、どうもリロケーションが必要なエントリ数が65535を超えるとここに1が入るようです。
ページ数はどこへ?と思ったらbinutilsのバージョン間でも結構違いがある様子。まあいいか。とりあえず最近のbinutilsはここはページ数ではなくフラグと。
結論としては、flexlinkは65535以上のエントリをサポートしていません。

この制限を切り抜けるため、ocamloptの吐く.oのリロケーションエントリ数をゴルフ……この話はまた今度。とりあえず今回はflexlinkの制限の話ということで終わらせていただきます。