為什麼那個二進位檔這麼大?

What

CodeSizer 是一個靜態程式碼大小分析工具。

在注重大小的嵌入式韌體開發中,最終的二進位檔經過大量內聯與連結時期最佳化。一個函式符號可能涵蓋數十個內聯函式。CodeSizer 使用 objdumpaddr2line 針對每個指令位址還原內聯呼叫堆疊,讓程式碼大小能歸屬到各函式內正確的內聯呼叫樹節點。

輸出結果為一個靜態 HTML 報告檔,內含少量 JavaScript 以提供樹狀檢視的展開/收合等 UI 功能。

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/gcc15 安裝 riscv-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 版本