CodeSizer:为什么那个二进制文件这么大?

Lobsters Hottest 工具

摘要

CodeSizer 是一款用于嵌入式固件的静态代码大小分析工具,它利用 objdump 和 addr2line 将代码大小归因于内联调用树,并生成 HTML 报告。

<p><a href="https://lobste.rs/s/ukyvbo/codesizer_why_is_binary_so_big">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/07/20 09:35

Wren6991/CodeSizer

来源:https://github.com/Wren6991/CodeSizer

CodeSizer

为什么那个二进制文件这么大?

简介

CodeSizer 是一个静态代码大小分析工具。

在以体积为焦点的嵌入式固件开发中,最终的二进制文件经过了大量的内联和链接时优化。单个函数符号可能覆盖多个内联函数。CodeSizer 使用 objdumpaddr2line 来展开每个指令地址处的内联调用栈,从而将代码大小归因到每个函数内部内联调用树中的正确节点。

输出是一个静态的 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)。

相似文章

说真的,大代码模型到底是干嘛用的?

Lobsters Hottest

本文探讨了GCC大代码模型(mcmodel=large)的局限性,特别是它无法处理带有32位重定位的线程局部存储(TLS),因此尽管其声称用于大型二进制文件,实际上却无法用于真正的大型二进制文件。

Zig ELF 二进制文件代码高尔夫 (2025)

Lobsters Hottest

深入技术探讨如何缩小 Zig ELF 二进制文件的大小,从 2180K 缩减至 500 字节以下,通过去除调试信息、切换到 ReleaseSmall 以及使用 freestanding 目标。

C程序员再犯可读性罪行

Hacker News Top

2025年国际混淆C代码大赛获奖者揭晓,共有23个参赛作品,其中包括Adrian Cable的Subleq计算机模拟器,该模拟器通过单指令集架构实现软件保存。