Tech Notes

Windowsの実行ファイルから.relocセクションを消す方法

たまにどうしてもファイルサイズに括りたくなる時ってありますよね。それ以上小さくしたところであんまり意味も無いのに。

僕だけでしょうか。

まぁサイズは小さいに越したことはありませんよね。

VisualStudioとC/C++を使って開発しているという実行速度+自由度至上主義な方向けに解説します。

まずWindowsの実行ファイル、EXEファイルですが、こいつの構造をざっくし説明すると

  • 先頭にヘッダー
  • その後にいくつかの「セクション」というデータの塊が並んでいる
  • 各セクションにそれぞれ違う役割を持ったデータが入っている(.textセクション→プログラムデータ、.rsrcセクション→リソースデータとか)

という構造になっており、これはVisual Studio付属の「dumpbin」というツールでexeファイルを解析することで簡単に確認することができます。

さて、とくに何も考えずにソフトを作れば凡そ5つのセクションが作られるのですが、その中に一つ要るのか要らんのか分からんセクションがあります。それが「.reloc」セクションです。

日本語でのまともな資料も英語での読解力もあまりないので何だかよく分からないセクションなのですが、実はこのセクションはプロジェクトの設定次第でバッサリ消せちゃいます。ので消しちゃいましょう。しわ寄せが来ないかなど気にしません。引かぬ媚びぬ省みぬです。

  1. プロジェクトのプロパティを開く
  2. 左メニューから「リンカ―」→「詳細設定」を開く
  3. 「ランダム化されたベース アドレス」の項目を「いいえ (/DYNAMICBASE:NO)」に設定
  4. 「固定ベース アドレス」の項目を「はい (/FIXED)」に設定
  5. 終わり

これで.relocセクションが消えて数KB~数十KBの節約になります。 本格的なバカでかいソフトならもっと節約できるかもしれません。

.relocセクションが何なのかをよく把握してないので何か問題が起きるかもしれませんが、普通に公開されてるソフトにも.relocセクションが無いものがあるので多分大丈夫でしょう。何か文句言われても知りません。勝手にコメント欄に質問しやがって下さい。勝手に調べて答えるかもしれません。

尤も、EXEファイル全体の3%にも満たないような容量にこだわるというのもアホらしいといえばアホらしいかもしれませんが。