完全相同的代码编译出的可执行文件大小不同
定位这个问题用了一些时间,这个问题很有意思,按道理完全相同的代码,编译出的二进制程序会不同,但大小应该是一致的。不同的地方往往是因为编译的时间戳不一致。今天定位问题时发现,完全相同的代码,测试人员拉取到源码后编译出的程序和开发人员拉取到源码编译出的程序大小差异将近1K. 而且是在同一个机器上进行编译的。 这个问题有意思是,因为做版本管理的时候,经常把二进制文件的大小作为版本是否一致的判读依据。如果这个依据有问题,那就有意思了。
源程序是很多.o文件链接起来的,进一步分析,发现相同的单cpp代码编译出.o文件大小都不一样。
利用objdump -h 观察双方的.o文件, 通过对比发现差异的段落发生在.debug_line 和.debug_str段落上。
OK,基本上到这就能猜出来是因为调试信息导致的了,调试信息会带上源文件具体的路径信息,虽然代码完全相同,但如果分别拉取的存放位置不一样了,会导致调试信息不一致。这样生成的二进制文件就不一样了。
把makefile中的-g选项去除后,这种"异常"就消失了。
回头来总结就几句话,但是找问题的时候,从各自的shell配置, 各种账户交叉验证,各种账户下编译器的版本配置检查等等, 还是走了一些弯路。
网友评论