C++ gcc为不同路径的相同代码库生成的二进制文件的差异
我有一个代码库(C和C++),编译时将生成具有不同校验和的二进制文件,即使在二进制文件上运行了C++ gcc为不同路径的相同代码库生成的二进制文件的差异,c++,c,gcc,C++,C,Gcc,我有一个代码库(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的二进制文件: 0000
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组织能够对它们进行验证。正如睡不着觉的pupper所说,不同的部分是
构建id
您可以通过在链接时传递
-Wl,--build id=none
来避免生成build id
部分,或者您可以使用strip--remove section=.note.gnu.build id
按位置将其从ELF中剥离,您是指机器,还是仅指指向源的文件系统路径?只是不同的文件系统路径。例如,如果我把源代码从我们的CM工具中拉到目录A中构建,我会得到一个校验和,但是如果我把另一个副本拉到目录B中,校验和就会不同,只在这一点上。通常,你会有一个生成“正式”二进制文件的构建系统,这样你就可以分发和比较它。但是,我也想知道为什么二进制文件是different@LordOphidian我的魔术球告诉我,您在问题中遗漏的不同部分是.note.gnu.buildid
。这本书的目的就是要解决你提到的问题。如果eu readelf-n
为您的二进制文件生成不同的构建id,那么您就有问题了。@sleeptightpupper似乎就是这样。谢谢现在我只需要找到一种方法来防止它不一样,这样当我的QA构建它时,它们会得到相同的校验和。