CodeSizer:为什么那个二进制文件这么大?
摘要
CodeSizer 是一款用于嵌入式固件的静态代码大小分析工具,它利用 objdump 和 addr2line 将代码大小归因于内联调用树,并生成 HTML 报告。
查看缓存全文
缓存时间: 2026/07/20 09:35
Wren6991/CodeSizer
来源:https://github.com/Wren6991/CodeSizer
CodeSizer
为什么那个二进制文件这么大?
简介
CodeSizer 是一个静态代码大小分析工具。
在以体积为焦点的嵌入式固件开发中,最终的二进制文件经过了大量的内联和链接时优化。单个函数符号可能覆盖多个内联函数。CodeSizer 使用 objdump 和 addr2line 来展开每个指令地址处的内联调用栈,从而将代码大小归因到每个函数内部内联调用树中的正确节点。
输出是一个静态的 HTML 报告文件,其中包含少量 JavaScript 以实现 UI 功能,例如切换树形视图的展开/折叠。
使用方法
来自交互式帮助:
`` 用法:codesizer.py [-h] [–cross-prefix CROSS_PREFIX] [–section SECTION] elf 输出
分析 ELF 文件的静态代码大小。通过 objdump 反汇编,通过 addr2line 展开内联调用栈,并生成静态 HTML 报告。
位置参数: elf 输入的 ELF 文件 output 输出的 HTML 文件
选项: -h, –help 显示此帮助信息并退出 –cross-prefix CROSS_PREFIX objdump 和 addr2line 的前缀(默认:riscv32-unknown- elf-) –section, -j SECTION 指定 ELF 节区。可多次传入以指定多个节区。 若未指定,则默认使用 .text。 ``
必须在您的 $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-。
示例输出
以下 HTML 报告(https://github.com/Wren6991/CodeSizer/releases/download/v0.1/arm-bootrom.html)由以下命令生成:
bash ./codesizer.py --cross-prefix arm-none-eabi- arm-bootrom.elf arm-bootrom.html -j .text -j .secure_gateways
该 ELF 文件来自 RP2350 A4 启动ROM发布版(https://github.com/raspberrypi/pico-bootrom-rp2350/releases/tag/A4)。
相似文章
Sloc Cloc and Code 4.0 (scc) - 找出最需要关注的文件
本文宣布了 Sloc Cloc and Code (scc) 4.0.0 版本的发布,其中包含新的热点分析功能,基于复杂度和提交历史来识别需要关注的代码文件。
说真的,大代码模型到底是干嘛用的?
本文探讨了GCC大代码模型(mcmodel=large)的局限性,特别是它无法处理带有32位重定位的线程局部存储(TLS),因此尽管其声称用于大型二进制文件,实际上却无法用于真正的大型二进制文件。
Zig ELF 二进制文件代码高尔夫 (2025)
深入技术探讨如何缩小 Zig ELF 二进制文件的大小,从 2180K 缩减至 500 字节以下,通过去除调试信息、切换到 ReleaseSmall 以及使用 freestanding 目标。
C程序员再犯可读性罪行
2025年国际混淆C代码大赛获奖者揭晓,共有23个参赛作品,其中包括Adrian Cable的Subleq计算机模拟器,该模拟器通过单指令集架构实现软件保存。
@rauchg: http://fx.sh 是 6.3MB。它启动时间在 10 微秒¹。它是一个 Zig 编译的静态 ELF 二进制文件,或者一个更小的 𝚕𝚒𝚋𝚏𝚡.𝚠𝚊…
一款名为 fx 的新型开源编码代理工具,使用 Zig 编译,具有微小的 6.3MB 二进制文件、10 微秒的即时启动以及 WebAssembly 支持,以实现优化性能和可嵌入性。