我正在使用readelf来弄清楚二进制文件为何如此之大,但我对输出感到困惑。或者我的二进制文件链接非常错误。现在二进制文件大约是380MB,如果我这样做:
readelf -W -s binary | awk'NR> 3 {sum + = $ 3} END {print sum}'
我得到236221726个字节。似乎很低,但也许我缺少静态符号或什么不是。但如果我这样做:
readelf -W -s binary | sort -n -r -k 3 |少
我明白这一点:
172766:000000000cf8d960 99993 FUNC GLOBAL DEFAULT 10 symbolA
147338:000000000cf8d960 99993 FUNC GLOBAL DEFAULT 10 symbolB
132791:000000000cf8d960 99993 FUNC GLOBAL DEFAULT 10 symbolA
107363:000000000cf8d960 99993 FUNC GLOBAL DEFAULT 10 symbolB
其中symbolA和symbolB只有1个字符不同,并且对同一个字符进行解码。
所以,我的问题: 1)如果那些东西具有相同的地址,我的二进制文件中实际上有四个副本吗? 2)如果没有四个副本,这些是别名,不应该readelf报告吗? 3)如果是四份,怎么样和为什么?我假设我正在做一些不好的联系方式。 4)如果没有四个副本,则readelf的总和大小低于二进制的实际大小 - 为什么?
编辑:添加更多信息......上面的readelf输出来自完全链接的二进制文件。仅查看包含symbolA / symbolB的.o,readelf仍会在同一地址报告每个symbolA和symbolB的1个副本。
但如果我objdump -d .o文件,我只看到symbolA的程序集。
那么 - 是objdump还是readelf“错误”?
答案 0 :(得分:0)
如果在标题中放置一个函数定义,然后将此标题包含在不同的源文件中,则会为每个包含生成一个不同的函数(好吧,除非它在所有内容中都有内联)特定的源文件)。不看你的消息来源很难说,但情况可能就是这样。
考虑在单独的源文件中移动大的非可嵌入函数,只在相应的头文件中留下声明。这可能会成功。