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)。
相似文章
SDCC – 小型设备C编译器
SDCC是一个小型设备C编译器,一种用于C语言编程小型和嵌入式系统的开发工具。
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 目标。
基于编译器的新型编程代理将成本降低一半,并提升代码智能(SWE-bench Verified 78.2% @ 0.1美分)
Benzi 是一个由编译器驱动的编程代理,它首先将代码库编译成可查询的调用关系、数据流和类层次结构映射。据称其使用 DeepSeek V4 flash 在每次修复成本不到 10 美分的情况下,在 SWE-bench Verified 上达到了 78.2% 的成绩。官方宣称其阅读的源代码量比 Claude Code 少一半,同时速度快 40%、成本低一半。它以 VS Code 扩展、无头运行时以及 MCP 工具的形式发布。