我创建了两个C程序
程序1
int main() { }
程序2
int main() { //Some Harmless comments }
AFAIK,在编译时,编译器(gcc)应该忽略注释和多余的白点,因此输出必须相似。
但是,当我检查输出二进制文件的md5sums时,它们不匹配。我也试图与优化的编译-O3
和-Ofast
,但他们仍然不匹配。
这是怎么回事
编辑:确切的命令和md5sums是(t1.c是程序1和t2.c是程序2)
gcc ./t1.c -o aaa
gcc ./t2.c -o bbb
98c1a86e593fd0181383662e68bac22f aaa
c10293cbe6031b13dc6244d01b4d2793 bbb
gcc ./t2.c -Ofast -o bbb
gcc ./t1.c -Ofast -o aaa
2f65a6d5bc9bf1351bdd6919a766fa10 aaa
c0bee139c47183ce62e10c3dbc13c614 bbb
gcc ./t1.c -O3 -o aaa
gcc ./t2.c -O3 -o bbb
564a39d982710b0070bb9349bfc0e2cd aaa
ad89b15e73b26e32026fd0f1dc152cd2 bbb
是的,md5sums在具有相同标志的多个编译中匹配。
顺便说一句我的系统是gcc (GCC) 5.2.0
和Linux 4.2.0-1-MANJARO #1 SMP PREEMPT x86_64 GNU/Linux
17
请包括您的确切命令行标志。例如,调试信息是否完全包含在二进制文件中?如果是这样,行号的更改显然会对其产生影响...
—
Jon Skeet
MD5总和在同一代码的多个版本之间是否一致?
—
unenthusiasticuser 2015年
我无法重现。我猜这是由GCC在编译二进制文件(包括时间戳)时将一堆元数据嵌入二进制文件中引起的。如果您可以添加您使用的精确命令行标志,那将很有用。
—
cyphar
不仅仅是检查MD5sum并被卡住,还可以通过hexdump和diff来确切查看哪些字节有所不同
—
MM
尽管问题的答案是“两个编译器输出之间有什么不同?” 有趣的是,我注意到这个问题有一个毫无根据的假设:两个输出应该相同,并且我们需要对它们为何不同的一些解释。编译器仅向您保证,当您给它提供合法的C程序时,输出就是实现该程序的合法可执行文件。编译器的任何两个执行都产生相同的二进制文件并不能保证C标准。
—
埃里克·利珀特