我使用readelf来找出二进制文件为什么这么大,但我对输出感到困惑。或者我的二进制文件被错误地连接起来了。现在二进制文件大约是380 do,如果我这样做的话:
-W -s二进制awk 'NR >3{ sum += $3 } END { print sum }‘NR>3
我有236221726字节。看起来很低,但也许我错过了静态符号什么的。但如果我这么做了
-W -s二进制类排序-n -r -k 3=减
我看到这个:
172766: 000000000cf8d960 99993 FUNC全球默认10 symbolA 147338: 000000000cf8d960 99993 FUNC全球默认10 symbolB 132791: 000000000cf8d960 99993 FUNC全球默认10 symbolA 107363: 000000000cf8d960 99993 FUNC全球默认10 symbolB
其中,symbolA和symbolB仅差1个字符,并对同一事物进行了分解。
那么,我的问题是: 1)如果这些东西有相同的地址,那么我的二进制文件实际上有4份吗? 2)如果没有4份副本,而这些是别名,难道不应该自己报告吗? 3)如果是4份,怎么做,为什么?我想我是在做一些糟糕的联系-明智的。4)如果没有四份拷贝,那么可读的之和大小就会低于二进制的实际大小--为什么?
编辑:添加更多信息.上述可读的输出来自于完全链接的二进制。只要查看包含双曲线/符号B的.o,readelf仍然会在相同的地址报告每个symbolA和symbolB的一份副本。
但是,如果我将-d文件转储给.o文件,我只看到symbolA的程序集。
所以
发布于 2017-05-24 20:21:10
如果将函数定义放置在头文件中,然后将此头包含在不同的源文件中,则将为每个包含生成不同的函数(除非它在特定源文件中的任何位置内联)。如果不看你的消息来源很难判断,但情况可能是这样的。
考虑在单独的源文件中移动大的、不可访问的函数,在相应的头中只留下声明。这也许能起作用。
https://stackoverflow.com/questions/44167430
复制相似问题