首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在同一个地址,几乎复制了可读的符号。

在同一个地址,几乎复制了可读的符号。
EN

Stack Overflow用户
提问于 2017-05-24 19:57:34
回答 1查看 715关注 0票数 0

我使用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的程序集。

所以

EN

回答 1

Stack Overflow用户

发布于 2017-05-24 20:21:10

如果将函数定义放置在头文件中,然后将此头包含在不同的源文件中,则将为每个包含生成不同的函数(除非它在特定源文件中的任何位置内联)。如果不看你的消息来源很难判断,但情况可能是这样的。

考虑在单独的源文件中移动大的、不可访问的函数,在相应的头中只留下声明。这也许能起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44167430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档