相同的来源但编译二进制不同

时间:2011-03-09 23:41:42

标签: vxworks binary-reproducibility

您好 我使用ccarm编译器在WinXP上为VxWorks开发C / C ++。我想在很久以前建立的已发布交付之上添加一个热修复程序。来源保留在Clear Case上,每个交货都贴上标签。因此,可以访问特定交付的源代码。

为了确保从原始发布版本没有任何改变,我必须确保我可以再次构建相同的输出文件。

这是问题所在;我从CC服务器检索源并构建它们。然后我将输出文件与相应的发布输出进行比较(输出文件的类型为* .lad文件+文件格式为elf32-littlearm)。差异很大(不是一些时间戳)。另一方面,我也比较汇编列表,它们也不同。

你知道什么会导致这样的差异吗? 在我看来,可能导致这种差异的项目清单 - 释放的输出是在不同的PC(再次使用WinXP)上构建的,带有自动构建脚本。新的输出是在我的本地构建的,具有相同的编译器和设置。 - 从存储库中检索到错误的标签

要添加什么?

提前致谢

2 个答案:

答案 0 :(得分:2)

您可以使用readelfobjdump获取有关二进制文件的详细信息,包括符号列表。

通过比较两者,你可以找出差异的原因。

如果您以前从未使用过readelf或objdump,可以在线找到大量文章和文档。

但是如果你使用相同的标签,使用相同的工具链(和相同的选项),输出就没有理由不同。

答案 1 :(得分:0)

您好 我对网络的搜索表明,二进制可重复性与增量构建问题有关。

如果您的构建系统配置为非增量,则所有内容都是从头开始构建的。使用此配置,即使两个连续的构建也会在输出图像和asm列表中产生巨大差异。 (我使用objdump -d来获取asm列表)

但是如果使用增量构建,那么输出图像仍然存在巨大差异,asm列表只有1-2行差异。

我的策略是依靠CM工具和标签。但我会提前检查readelf。 谢谢