なぜそのバイナリはそんなに大きいのか?

What

CodeSizerは静的コードサイズ解析ツールです。

サイズ重視の組み込みファームウェア開発では、最終バイナリは高度にインライン化され、リンク時最適化されています。単一の関数シンボルが数十のインライン化された関数をカバーする場合があります。CodeSizerはobjdumpaddr2lineを使用して各命令アドレスのインラインコールスタックを展開し、コードサイズを各関数のインラインコールツリー内の正しいノードに割り当てます。

出力は静的なHTMLレポートファイルで、ツリービューの展開/折りたたみなどのUI機能のために少量のJavaScriptが含まれています。

How

インタラクティブヘルプより:

usage: codesizer.py [-h] [--cross-prefix CROSS_PREFIX] [--section SECTION]
                    elf output

Analyse static code size of an ELF file. Disassemble via objdump, unwind inline
call stacks via addr2line, and emit a static HTML report.

positional arguments:
  elf                   input ELF file
  output                output HTML file

options:
  -h, --help            show this help message and exit
  --cross-prefix CROSS_PREFIX
                        prefix for objdump and addr2line (default: riscv32-unknown-
                        elf-)
  --section, -j SECTION
                        Specify ELF section. Pass multiple times for multiple
                        sections. If unspecified, .text is used.

指定されたプレフィックスを持つ正しいツールチェーンが$PATH上に存在するか、ツールチェーンバイナリへのフルパスを指定する必要があります。例:

  • Ubuntuでgcc-arm-none-eabiパッケージをインストールした場合、--cross-prefix=arm-none-eabi-を使用します。

  • /opt/riscv/gcc15riscv-gnu-toolchainビルドをインストールした場合、--cross-prefix=/opt/riscv/gcc15/bin/riscv32-unknown-elf-を使用します。

Example Output

このHTMLレポートは以下のコマンドで生成されました:

./codesizer.py --cross-prefix arm-none-eabi- arm-bootrom.elf arm-bootrom.html -j .text -j .secure_gateways

ELFファイルはRP2350 A4 bootromリリースからのものです。