不同的源代码能生成相同的可执行文件吗?
这种情况是否可能发生?
不同的源代码能生成相同的可执行文件吗?
这种情况是否可能发生?
是的,编译器可以进行很多优化,不同的源代码可以映射到相同的目标代码。以下是一些简单的例子。请注意,这些例子是与语言相关的。
int nabs1(int a){
return -abs(a);
}
int nabs2(int a){
return(a<0) ? a : -a;
}
gcc -O6 生成相同的代码:
_nabs1:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %edx
popl %ebp
movl %edx, %eax
sarl $31, %eax
xorl %eax, %edx
subl %edx, %eax
ret
.p2align 4,,15
.globl _nabs2
.def _nabs2; .scl 2; .type 32; .endef
_nabs2:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %edx
popl %ebp
movl %edx, %eax
sarl $31, %eax
xorl %eax, %edx
subl %edx, %eax
ret
这取决于你如何定义相似。在Java或C#中进行微小更改并使其生成相同的字节码是可能的。
例如,在C语言中,如果我使用预处理命令来处理文字字符串,或者直接使用文字字符串,则生成的代码应该是相同的,但源码不同。