【发布时间】:2023-04-03 16:14:01
【问题描述】:
我正在使用 readelf 来找出二进制文件为何如此之大,但我对输出感到困惑。或者我的二进制文件链接非常错误。现在二进制文件大约是 380MB,如果我这样做:
readelf -W -s 二进制文件 | awk 'NR > 3 { sum += $3 } END { print sum }'
我得到 236221726 字节。似乎很低,但也许我缺少静态符号或没有。但如果我这样做:
readelf -W -s 二进制文件 |排序 -n -r -k 3 |少
我看到了:
172766: 000000000cf8d960 99993 FUNC 全局默认值 10 符号A
147338: 000000000cf8d960 99993 FUNC 全局默认值 10 符号B
132791: 000000000cf8d960 99993 FUNC 全局默认值 10 符号A
107363: 000000000cf8d960 99993 FUNC GLOBAL DEFAULT 10 符号B
其中 symbolA 和 symbolB 仅相差 1 个字符,并且对同一事物进行分解。
所以,我的问题: 1)如果这些东西具有相同的地址,我的二进制文件中实际上有四个副本吗? 2)如果没有四个副本,并且这些是别名,那么 readelf 不应该报告吗? 3)如果是四个副本,如何以及为什么?我假设我在做一些不好的链接方式。 4) 如果没有四个副本,那么来自 readelf 的总大小远低于二进制文件的实际大小 - 为什么?
编辑:添加更多信息...上面的 readelf 输出来自完全链接的二进制文件。仅查看包含 symbolA/symbolB 的 .o,readelf 仍会在同一地址报告每个 symbolA 和 symbolB 的 1 个副本。
但是如果我 objdump -d .o 文件,我只会看到 symbolA 的程序集。
那么 - objdump 或 readelf 是“错误的”吗?
【问题讨论】: