提取 ELF 中所有符号的大小和来源

提取 ELF 中所有符号的大小和来源

我正在尝试估计二进制文件各个组件的代码大小。我可以访问源代码和包含所有构建对象文件的生成目录。当然,我只想包含实际使用的符号,因此添加所有目标文件.text.data部分的大小最终会高估实际值。

如何确定用于链接 ELF 文件的所有符号的大小和来源?像这样的东西会很有用:

Symbol   Size   Origin
func1    0x50   ../src/func1.o
func2    0x75   ../src/func2.o
...

对于所有符号来说都是类似的.data。生成的.map文件似乎有一些这些数据,但似乎不完整。突出的两个部分是:

Allocating common symbols
Common symbol       size              file

s_Handle         0x8               ../BUILD/src/handle.o
_main_obj        0x48              ../BUILD/src/boot.o
....

但这里只列出了几十个符号。以下部分似乎有更多的符号,但它们似乎在链接时被列为“废弃”:

Discarded input sections

 .text          0x00000000        0x0 /home/user/.programs/gcc-arm-none-eabi-5_4-2016q3/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7e-m/crti.o
 .data          0x00000000        0x0 /home/user/.programs/gcc-arm-none-eabi-5_4-2016q3/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7e-m/crti.o
 .bss           0x00000000        0x0 /home/user/.programs/gcc-arm-none-eabi-5_4-2016q3/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7e-m/crti.o
 .data          0x00000000        0x0 /home/user/.programs/gcc-arm-none-eabi-5_4-2016q3/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7e-m/crt0.o
 .bss           0x00000000        0x0 /home/user/.programs/gcc-arm-none-eabi-5_4-2016q3/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7e-m/crt0.o
 .ARM.extab     0x00000000        0x0 /home/user/.programs/gcc-arm-none-eabi-5_4-2016q3/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7e-m/crt0.o
 .text._Z12notify_startv
                0x00000000       0x14 ../BUILD/./test_env.o
 .text._Z30notify_performance_coefficientPKci
                0x00000000       0x18 ../BUILD/./test_env.o
 .text._Z30notify_performance_coefficientPKcj
                0x00000000       0x18 ../BUILD/./test_env.o
 .text._Z30notify_performance_coefficientPKcd
                0x00000000       0x20 ../BUILD/./test_env.o
 .text._Z17notify_completionb
                0x00000000       0x64 ../BUILD/./test_env.o
 .text._Z21notify_completion_strbPc
                0x00000000       0x30 ../BUILD/./test_env.o
...

答案1

您可能想使用臃肿的麦克布洛特脸

“VM SIZE”列告诉您二进制文件加载到内存中时将占用多少空间。 “文件大小”列告诉您二进制文件在磁盘上占用了多少空间。 [...]默认值分解在布洛蒂是按部分,但支持许多其他切割二进制文件的方法,例如符号细分市场。如果你使用调试信息进行编译,你甚至可以崩溃通过编译单元和内联

答案2

我无法评论,仅供参考:该Allocating common symbols部分列出了程序中全局变量的名称和大小。

相关内容