【发布时间】:2016-05-18 20:57:09
【问题描述】:
我有一个代码库(C 和 C++),即使在对二进制文件运行 strip 之后,编译时也会生成具有不同校验和的二进制文件。
在十六进制中对二进制文件进行比较会产生以下几行作为唯一的区别:
位置 1 的二进制文件:
00000170: 0300 0000 474e 5500 7645 15ec 09f5 2b56 ....GNU.vE....+V
00000180: 0679 e9a4 d49d 29e0 7de8 fb5b 0300 0000 .y....).}..[....
位置 2 的二进制文件:
00000170: 0300 0000 474e 5500 cf2a 4316 2262 679d ....GNU..*C."bg.
00000180: 5691 b91a 52a8 29d2 45e8 c204 0300 0000 V...R.).E.......
在我看来,这必须是校验和或类似的东西。我会怀疑时间戳,除非我清理然后在同一目录中进行重建,否则二进制文件将具有相同的校验和。
有谁知道这可能是什么?我想确保我的二进制文件即使在不同位置构建时也具有相同的校验和,以便我的 QA 组织可以对其进行验证。
【问题讨论】:
-
通过位置,您是指机器,还是只是指向源的文件系统路径?
-
只是文件系统路径不同。因此,例如,如果我将源代码从 CM 工具中拉出到目录 A 并构建,我会得到一个校验和,但是如果我将另一个副本拉到目录 B 中,校验和将有所不同,仅在这一点。
-
通常,您将拥有一个生成“官方”二进制文件的构建系统,因此您可以分发并与那个二进制文件进行比较。但是,我也想知道为什么二进制文件不同
-
@LordOphidian 我的魔法球告诉我你在问题中遗漏的不同部分是
.note.gnu.build-id。 build-id 的重点是解决您提到的确切问题。如果eu-readelf -n为您的二进制文件生成不同的 build-id,那么您就有问题了。 -
@sleeptightpupper 似乎就是这样。谢谢!现在我只需要找到一种方法来防止它与众不同,这样当我的 QA 构建它时,它们会得到相同的校验和。