不同的源代码能生成相同的可执行/二进制文件吗?

3

不同的源代码能生成相同的可执行文件吗?

这种情况是否可能发生?


1
如果我只是重命名所有变量,那很容易。或者你是在问更有意义的改变吗? - dmckee --- ex-moderator kitten
由于这两个程序编译成相同的可执行文件,我认为两个源代码文件的意图应该是相同的,因此差异并不太有意义,只是表达上的差异。除非目标是两个不同的处理器。 :-) - Nosredna
我的意思是两个做不同事情的程序,它们可以有相同的二进制文件吗? - newer
1
只有当它们在不同的处理器或虚拟机上运行时才成立。 - Nosredna
3个回答

6

是的,编译器可以进行很多优化,不同的源代码可以映射到相同的目标代码。以下是一些简单的例子。请注意,这些例子是与语言相关的。

  • 您可以使用十进制、十六进制、八进制或二进制表示整数——目标代码中的结果将是相同的。
  • 在许多语言中,变量名不会出现在可执行文件中,您可以更改变量的名称而不影响可执行文件。

4
是的。例如。
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

1

这取决于你如何定义相似。在Java或C#中进行微小更改并使其生成相同的字节码是可能的。

例如,在C语言中,如果我使用预处理命令来处理文字字符串,或者直接使用文字字符串,则生成的代码应该是相同的,但源码不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接