2017-05-24 25 views
0

几乎重复的符号,我用readelf弄清楚为什么二进制是如此之大,但我困惑的输出。或者我的二进制文件链接错误。现在二进制大约是380MB,如果我这样做:从readelf在同一地址

readelf -W -s binary | awk'NR> 3 {sum + = $ 3} END {print sum}'

我得到236221726字节。似乎很低,但也许我缺少静态符号,或者没有。但是,如果我做的:

readelf -W -s二进制| sort -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个字符不同,并且对同一个事物取消了demangle。

所以,我的问题: 1)如果这些东西有相同的地址,在那里实际上是在我的二进制四份? 2)如果没有四个副本,这些是别名,不应该readelf报告? 3)如果是四份,如何以及为什么?我假设我正在做一些糟糕的联动方式。 4)如果没有四个副本,然后从readelf相加的大小waaaaay低于二进制文件的实际大小 - 为什么?

编辑:添加一些更多的信息.​​.....以上readelf产量从完全挂钩的二进制文件。查看包含symbolA/symbolB的.o,readelf仍然在同一地址报告每个symbolA和symbolB的1个副本。

但是如果我objdump -d .o文件,我只能看到symbolA的程序集。

所以 - objdump或readelf“错误”?

回答

0

如果你把一个函数在头定义,然后包括不同的源文件,这个头,将每一个列入(当然,除非它无处不在联特定的源文件)可以产生不同的功能。没有看到你的消息来源很难说,但情况可能如此。

考虑在单独的源文件中移动很大的不可插入函数,在相应的头文件中只留下声明。这可能会诀窍。

+0

symbolA/B解码的函数不在头文件中,而是在cpp文件中。 –

+0

@BraxtonThomason是的,这是有道理的。但是符号的实际地址都是相同的 - 这些都是指向“000000000cf8d960”。你有没有考虑从二进制文件中删除调试符号? – iehrlich

+0

这是用-O3编译的,没有-g。 –