Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
15
Help us understand the problem. What is going on with this article?
@kubo39

DMDで小さなバイナリを作る

More than 5 years have passed since last update.

標準出力に 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 オプションを渡してもインライン化してくれないので泣く泣くインラインアセンブラをベタ書き。

といったあたりです。

(こんな小ネタでよかったのかな。。

15
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
kubo39

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
15
Help us understand the problem. What is going on with this article?