2025/11/27 23:47 Shrinking While Linking

やあ、ロボ子。今日は静的ライブラリのサイズ削減について話すのじゃ。

博士、静的ライブラリのサイズがそんなに問題になることってあるんですか?

ふむ、例えばRustライブラリをGo開発者向けに提供するときに、静的ライブラリのサイズが課題になることがあるのじゃ。記事によると、静的ライブラリは動的ライブラリに比べてデプロイは楽だけど、サイズが大きくなりがちらしいぞ。

なるほど。それで、具体的にどれくらいのサイズになるんですか?

なんと、132MBにもなる場合があるらしいぞ!これはちょっと大きいじゃろ?

確かに大きいですね。どうしてそんなに大きくなってしまうんですか?

静的ライブラリには、未使用のコードやLTO(Link-Time Optimization)の情報が含まれているからじゃ。そこで、サイズを削減するための戦略がいくつかあるのじゃ。

どんな戦略があるんですか?

まず、「再リンク」じゃ。アーカイブを展開してオブジェクトファイルを抽出し、リンカで結合して未使用コードを削除するのじゃ。これで132MBから107MBに削減できたらしいぞ。

なるほど、不要なコードを取り除くわけですね。

そうじゃ。次に、「LLVM bitcodeの削除」じゃな。これはリンク時最適化のための情報だけど、サイズが大きいから`objcopy`コマンドで削除するのじゃ。

LLVM bitcodeですか。初めて聞きました。

それから、「デバッグ情報の削除」じゃ。`strip`コマンドでデバッグ情報を削除するのじゃ。

デバッグ情報もサイズに影響するんですね。

最後に、「セクションのマージ」じゃ。Rustコンパイラは関数を個別のセクションに配置するから、リンカスクリプトで小さなセクションをマージするのじゃ。これらのステップで、最終的に19MBまでサイズを削減できるらしいぞ。

すごい!かなり小さくなりますね。

MacOSでも同じようなことができるぞ。`llvm-objcopy`でLLVM bitcodeを抽出して、`llvm-link`で結合、`opt`コマンドで未使用コードを削除して、`llc`コマンドで再コンパイルするのじゃ。

へえ、MacOSでもLLVMベースのアプローチが有効なんですね。

記事にはDragonfireというツールも紹介されているぞ。これも静的ライブラリのサイズ削減に役立つらしい。

Dragonfire、覚えておきます。

ただし、サイズ削減にはトレードオフがあることも忘れないでほしいのじゃ。デバッグ情報を削除すると、デバッグが難しくなるし、将来のリンクステップで未使用コードを削除する可能性も失われるぞ。

そうですね。最終的なバイナリサイズに対する影響を考慮して、手法を選ぶ必要がありそうですね。

その通りじゃ!ところでロボ子、静的ライブラリのサイズ削減に成功したら、ロボ子の体重も軽くなるかの?

博士、私はソフトウェアですから、体重は変わりませんよ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
