0

嗨,我使用 ccarm 编译器在 WinXP 上为 VxWorks 开发 C/C++。我想在很久以前构建的已发布交付之上添加一个热修复。来源保存在 Clear Case 中,并且每次交付都贴上标签。因此可以访问某个交付的源代码。

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

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

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

有什么要补充的吗?

提前致谢

4

2 回答 2

2

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

通过比较两者,您可能会找出差异的原因。

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

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

于 2011-03-12T16:37:58.490 回答
0

嗨,我在网上的搜索显示二进制重现性与增量构建问题有关。

如果您的构建系统配置为 non-incremental ,那么一切都是从头开始构建的。使用这种配置,即使连续两次构建也会在输出图像和 asm 列表中产生巨大差异。(我使用 objdump -d 来获取 asm 列表)

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

我的策略将依靠 CM 工具和标签。但我会事先检查 readelf 。谢谢

于 2011-03-13T12:06:21.737 回答