![提取 ELF 中所有符号的大小和来源](https://linux22.com/image/118351/%E6%8F%90%E5%8F%96%20ELF%20%E4%B8%AD%E6%89%80%E6%9C%89%E7%AC%A6%E5%8F%B7%E7%9A%84%E5%A4%A7%E5%B0%8F%E5%92%8C%E6%9D%A5%E6%BA%90.png)
我正在尝试估计二进制文件各个组件的代码大小。我可以访问源代码和包含所有构建对象文件的生成目录。当然,我只想包含实际使用的符号,因此添加所有目标文件.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
部分列出了程序中全局变量的名称和大小。