GCC编译的二进制文件W /不同的大小?

如果相同的代码在不同的时间w / gcc被build立,得到的二进制将有不同的内容。 好的,我不是那么狂野,但是这就是它的原因。

不过,我最近碰到的情况是,使用相同版本的gcc构build的相同代码生成的二进制文件的大小与之前的版本(大约1900字节)不同。

有没有人有任何想法可能导致这些情况? 这是ELF的问题吗? 是否有任何工具可以用来转储二进制文件的内容来查看究竟有什么不同?

提前致谢。

Solutions Collecting From Web of "GCC编译的二进制文件W /不同的大小?"

objdump可能是您正在寻找转储二进制文件内容的程序。

objdump -h将显示部分和它们的大小,所以您应该能够看到大小更改发生的位置,然后深入查看原因。

我设法把事情弄清楚,至少让我满意,并想传递我发现的东西。

使用readelf(readelf -a -W),我创建了一个报告,列出两个构建的内容并进行比较(使用Beyond Compare)。 这表明一些额外的符号从提升库中被拉入。

瞧,我们实际上正在建立一个不同版本的附属图书馆,并没有意识到这一点。 在这种情况下没有损害,但是知道什么是可执行文件是很好的。

感谢所有的深思熟虑的答复。

一个可复制的例子将有助于:

  • 你使用其他外部库吗?
  • 你是静态链接还是动态链接?
  • 你是否改变了像-O或-s这样的标志?

这已经被问过了 ,回答是编译器的内部状态在不同的编译器运行中可能会有所不同,这可能会导致不同的代码被发射,从而具有不同的大小。

DEC VMS编译器也习惯这样做。 原因是优化器可以更好地处理更多可用的RAM。 显然,每次编译时都有相同数量的可用RAM空间是非常困难的。

我记得当时有人对此感到震惊。 对于那些喜欢通过区分所得到的二进制文件来检查源代码变化的人来说,情况尤其如此。 我现在的建议就是克服它。 您可以“差异”的来源。 对于二进制文件,唯一的保证是从相同的源文件编译的两个可执行文件将做你告诉他们做的事情。

除了编译器之外,还需要检查链接的标准库。 检查他们的版本,并确认他们没有改变。

在其他方面相同的版本之间的大小差异的一个可能的原因是可以存储在二进制文件中的可变大小的信息。 一些例子:

  • 编译器可能会在编译时将关于invoved文件的路径/名称信息放在调试信息中或由于使用了__FILE__宏。 这可能是为了达到自己的目的,而与这两者无关。 如果构建发生在不同的机器上,即使是略有不同的目录结构,也可以解决二进制中的差异。
  • 类似的构建日期/时间,虽然我希望这些会找到自己的方式更少的二进制(但我知道什么?)。 如果这是一个促成因素,即使是在同一台机器上完全相同的版本,您也会看到不同的大小,只是在不同的enuogh时间。

正如尼尔·巴特沃斯(Neil Butterworth)指出的那样 ,这些东西归结为造机器状态的差异。