標準出力に Hello! を返すだけのプログラムをDMDが生成するオブジェクトファイルからどれだけ最小化していけるか、ということをやって、最終的に 192 バイトまで小さくしました。
具体的な内容はこちらのレポジトリにまとめています。 https://github.com/kubo39/tiny-d-demo
行ったこととしては、プログラムの実行に必要な最小構成をひとつのセクションにまとめて、プログラムの実行に必要ない部分をざっくり削ってしまう、ということだけです。
注意すべき点としてはカスタムELFヘッダがエントリポイントのアドレスを事前に知っている必要があるため、
シンボル情報から _Dmain
(D言語のvoid main()のC表現)のアドレス情報を抜き出して渡しているところくらいでしょうか。
四方山話としては、
gcc のオプションに
-Xlinker -static
を渡したところundefined reference to
__tls_get_addr'` というのでどうやってもうまくいかず、これはdmdにバグ報告だ!と思ったらすでにあった http://forum.dlang.org/thread/bug-12268-3@https.d.puremagic.com%2Fissues%2F自作の syscall.d を使いたかったけれど、dmdが
-inline
オプションを渡してもインライン化してくれないので泣く泣くインラインアセンブラをベタ書き。
といったあたりです。
(こんな小ネタでよかったのかな。。