C++ 同一地址的readelf中几乎有重复的符号

C++ 同一地址的readelf中几乎有重复的符号,c++,linux,linker,readelf,C++,Linux,Linker,Readelf,我用readelf来解释二进制文件为什么这么大,但我对输出感到困惑。或者我的二进制文件链接错误。现在二进制大约是380MB,如果我这样做: readelf-W-s二进制| awk'NR>3{sum+=$3}END{print sum} 我得到236221726字节。看起来很低,但也许我缺少了静态符号或者什么。但如果我这样做: readelf-W-s二进制| sort-n-r-k3 | less 我看到: 172766:000000000 CF8D960 99993函数全局默认值10符号 1473

我用readelf来解释二进制文件为什么这么大,但我对输出感到困惑。或者我的二进制文件链接错误。现在二进制大约是380MB,如果我这样做:

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

我得到236221726字节。看起来很低,但也许我缺少了静态符号或者什么。但如果我这样做:

readelf-W-s二进制| sort-n-r-k3 | less

我看到:

172766:000000000 CF8D960 99993函数全局默认值10符号

147338:000000000 CF8D960 99993 FUNC全局默认值10 symbolB

132791:000000000 CF8D960 99993函数全局默认值10符号

107363:000000000 CF8D960 99993 FUNC全局默认值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是否“错误”?

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


考虑在单独的源文件中移动不可内联的大函数,只在相应的头文件中保留声明。这可能会奏效

symbolA/B解码到的函数不在头文件中,而是在cpp文件中。@BraxtonTomason是的,这很有意义。但是符号的实际地址都是相等的——它们都指向
000000000 cf8d960
。是否考虑从二进制文件中删除调试符号?这是用-O3和没有-g编译的。