不同操作系统版本的编译器输出

时间:2017-12-13 16:00:20

标签: gcc assembly compilation operating-system

据我所知(如果我错了,请纠正我),编译器的输出取决于所使用的架构版本,编译器和操作系统。

让我说我使用ubuntu发布16.04 x84-64并使用gcc版本5.4编译c文件(或者任何其他OS,arch,编译器的混合)。

据我所知,直到现在,如果我要编译相同的c文件,但使用不同的ubuntu版本,使用相同的arch和编译器版本,它应该生成相同的汇编代码。

经过几次尝试后,我得到的印象是这是不正确的,这怎么可能?

编译器的输出是否取决于特定操作系统的发布?

其中一个例子是在2个不同的ubuntu版本上编译https://github.com/tbuktu/libntru并接收不同的程序集。

2 个答案:

答案 0 :(得分:2)

不同的操作系统可能安装了不同版本的默认库(它们会链接到您的最终应用程序中)。因此,最终结果可能略有不同。

答案 1 :(得分:1)

如果您只是做了一些ubuntu版本,差异的可能性会降低,因为整体架构差异可能无法在您的测试中反映出来,或者可能在相同的os系列上长时间使用相同的编译器系列无法改变。如果您在同一个发行版的较旧版本中更容易看到测试中的差异,那么编译器的新版本/最新版本不会直接作为apt-get移植/支持。也许你可以让他们手工构建,但gcc特别糟糕的是他们的代码仅使用相对较新的先前版本或后续版本构建得太远而gcc无法构建gcc。我首先期望看到的是严格的gcc版本差异,你开始看到编译器的差异。

更好的测试是采用一个简单的.c文件并为Windows构建任何版本(使用为该系统构建的相同版本的gcc)和ubuntu / linux任何版本。应该更快地看到差异。

两个不同的编译器应该显示合理大小的项目的差异,或基于知识的目标小代码样本,例如llvm / clang vs gcc。相同编译器或编译器系列的不同版本将根据定义显示出随时间的差异,6.x vs 6.x + 1 gcc是否显示差异,如果你知道在哪里看但往往不是,但是gcc 3.x vs gcc 7.x应该然后根据测试你可以从那里缩小。

您可以在同一操作系统和系统上编译器编译器差异,这些差异可能会显示出差异。

您有多种原因可以解释为什么系统与系统之间的差异与同一编译器存在差异。

然后上述组合自然也会显示差异。

更大的问题是你为什么关心,教育信息是如果你改变编译器,编译器设置或操作系统,你不应该期望相同的C源代码以相同的方式构建。它可以有任何地方,从没有差异到基于上述任何一个的巨大差异。从优化和其他调整设置开始,并从那里开始。