我有一个一个月前构建的特定程序的工作可执行文件。我不小心删除了开发环境中的exe,所以我编译了一个新的exe。但是,我在 uat 环境中有一份工作 exe 的副本,其校验和与新的 exe 不同。
两个exe文件大小相同:
----------+ 1 raymond1 Domain Users 623616 Jan 3 16:47 A.EXE;24
----------+ 1 raymond1 Domain Users 623616 Jan 4 11:11 A.EXE;25
但是他们有不同的校验和:
$ sha1sum "A.EXE;24"
cb87ec4b746677903969ba61361a60c14461b5e0 *RIIB.EXE;24
$ sha1sum "A.EXE;25"
09453f40e53e280abbb98bd0013f1ddf312706b8 *RIIB.EXE;25
所以我想知道我生成新exe的方式是否有问题,也许我忘记编译它所依赖的一些程序。
无论如何,我用与版本 25 完全相同的方式编译了另一个 exe。它仍然与其他两个 exe 具有相同的大小。我刚刚又链接了一次。但版本 26 也有不同的校验和。
$ sha1sum "RIIB.EXE;26"
e2378544a91db49927738fd0135181b9daf125be *RIIB.EXE;26
所以我想知道我是否能找出它们之间的区别。
附注该exe是在OpenVms中生成的,我将其ftp到我的机器上以获取校验和(WIN 7中的CYGWIN)。
编辑:
我按照评论中的建议进行了二进制比较。
这是结果:
$ xxd "A.EXE;24" > b24.hex
$ xxd "A.EXE;25" > b25.hex
$ xxd "A.EXE;26" > b26.hex
$ diff b24.hex b25.hex
34849,34850c34849,34850
< 0088200: 1900 0060 0000 0000 6ff8 42de 9b2c 0100 ...`....o.B..,..
< 0088210: 3500 0060 0000 0000 8c6f f842 de9b ac00 5..`.....o.B....
---
> 0088200: 1900 0060 0000 0000 62b3 87f4 cd2c 0100 ...`....b....,..
> 0088210: 3500 0060 0000 0000 0b62 b387 f4cd ac00 5..`.....b......
38862c38862
< 0097cd0: 4950 462f 564d 5300 8c6f f842 de9b ac00 IPF/VMS..o.B....
---
> 0097cd0: 4950 462f 564d 5300 0b62 b387 f4cd ac00 IPF/VMS..b......
38868c38868
< 0097d30: 0100 0000 0300 0000 8c6f f842 de9b ac00 .........o.B....
---
> 0097d30: 0100 0000 0300 0000 0b62 b387 f4cd ac00 .........b......
38872c38872
< 0097d70: 4950 462f 564d 5300 8c6f f842 de9b ac00 IPF/VMS..o.B....
---
> 0097d70: 4950 462f 564d 5300 0b62 b387 f4cd ac00 IPF/VMS..b......
$ diff b25.hex b26.hex
34849,34850c34849,34850
< 0088200: 1900 0060 0000 0000 62b3 87f4 cd2c 0100 ...`....b....,..
< 0088210: 3500 0060 0000 0000 0b62 b387 f4cd ac00 5..`.....b......
---
> 0088200: 1900 0060 0000 0000 10a5 1c14 ce2c 0100 ...`.........,..
> 0088210: 3500 0060 0000 0000 e710 a51c 14ce ac00 5..`............
38862c38862
< 0097cd0: 4950 462f 564d 5300 0b62 b387 f4cd ac00 IPF/VMS..b......
---
> 0097cd0: 4950 462f 564d 5300 e710 a51c 14ce ac00 IPF/VMS.........
38868c38868
< 0097d30: 0100 0000 0300 0000 0b62 b387 f4cd ac00 .........b......
---
> 0097d30: 0100 0000 0300 0000 e710 a51c 14ce ac00 ................
38872c38872
< 0097d70: 4950 462f 564d 5300 0b62 b387 f4cd ac00 IPF/VMS..b......
---
> 0097d70: 4950 462f 564d 5300 e710 a51c 14ce ac00 IPF/VMS.........
他们在同一行中有不同的地方。也许是时间戳导致问题?
最佳答案
就程序功能而言,如果您使用完全相同的参数编译了完全相同的代码,这两个版本之间没有区别(除非您有一些极其奇怪的编译器错误)。请注意,您可能还对代码中的环境设置有一定的依赖性,例如编译器生成的日期或时间常量 - 对于每个编译来说,这些常量自然会有所不同。
签名应该是不同的,因为还有其他因素会影响实际生成的二进制文件,例如编译时间、环境、编译器元数据或编译期间的天气状态。事实上,如果签名相同,那就意味着 sha1
毫无值(value)。
编辑:
编译器生成的常量,例如 __LINE__
(例如,预构建脚本可能会将一些 #define
注入(inject)代码分析工具的代码中)、 __DATE__
和 __TIME__
可能会从一种编译更改为另一种编译。
如果编译器认为 .obj
是最新的,它可能会选择不重新编译某些文件(这并不总是正确的,特别是在使用预编译头的情况下,但不仅如此 - 导致无效的.exe)。此外,由于速度或优化或任何其他原因,连接器可能对连接顺序有内部考虑。
关于c - 我如何知道两个exe是否有不同的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14152641/