ELF节和符号大小分析工具

45

我需要一种分析ARM体系结构GCC编译器输出文件的方法,我正在为裸机编译,对程序大小非常关注。我可以使用由交叉编译器提供的 arm-none-eabi-objdump,但是如果存在用于此任务的工具,我不愿意解析输出。你知道是否存在这样的工具吗?我的搜索结果没有任何结果。

另外,我的代码中每个函数都在自己的部分中。


你想做什么?你想检索什么样的信息? - ouah
4个回答

93

您可以使用 nmsize 来获取函数和 ELF 片段的大小。

要获取函数(和具有静态存储期限的对象)的大小:

$ nm --print-size --size-sort --radix=d tst.o
第二列显示函数和对象的十进制大小。
要获取各个部分的大小:
$ size -A -d tst.o

第二列显示了各节的十进制大小。


“nm”,那不是Windows吗?如果是的话,抱歉 - 我没有说我正在使用Linux。 - RushPL
6
Windows?不,nmsize是GNU工具的一部分,也是binutils的一部分。为了在跨平台上运行这些工具,请添加所需的平台前缀(例如,输入arm-none-eabi-nmarm-none-eabi-size)。 - ouah
有趣的是,这也具有去除ARM的映射符号的大小效应。这些符号没有大小字段(即该字段缺失,而不是打印为零),当使用--size-sort运行nm时,它们会被删除。 - sherrellbc
@ouah 但是nm输出的总节大小与文件大小不相等。这里缺少什么? - undefined

11

readelf 工具非常方便,可以显示各种节信息,包括节大小等:

arm-none-eabi-readelf -e foo.o

如果你关心运行时内存占用,可以忽略那些没有设置'A'(分配)标志的部分。


arm-none-eabi-readelf -s build/program.out|perl -ne 'if(/(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/) { print $3 . " " . $8. "\n";}'|sort -n - RushPL
谢谢,上述方法对我很有帮助!我之前不知道readelf。 - RushPL

4
当我们在10年后重新审视这个问题时,必须提到一个基于Python的readelf和nm包装器,称为elf-size-analyze: elf-size-analyze,如下图所示: screenshot

2

puncover使用objdump和其他几个gcc工具生成HTML页面,您可以轻松浏览以了解代码和数据空间的使用情况。

它比gcc工具的文本输出更好看。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接