【发布时间】:2018-05-27 14:22:19
【问题描述】:
据我了解(如果我错了,请纠正我),编译器的输出取决于所使用的体系结构版本、编译器和操作系统。
假设我使用 ubuntu 版本 16.04 x84-64 并使用 gcc 版本 5.4 编译 c 文件(或任何其他 OS、arch、编译器的组合,例如)。
据我了解,如果我要编译相同的 c 文件,但使用不同的 ubuntu 版本,使用相同的架构和编译器版本,它应该会生成相同的汇编代码。
经过几次尝试,我的印象是这是不正确的,这怎么可能?
编译器的输出是否取决于特定操作系统的版本?
其中一个示例是在 2 个不同的 ubuntu 版本上编译 https://github.com/tbuktu/libntru 并接收不同的程序集。
【问题讨论】:
-
编译器输出还取决于优化标志(并且有 许多 个)。
-
您如何确保在不同的操作系统版本上拥有相同的编译器版本?是否有可能它们的配置不同?例如one of them with
--enable-default-pie,还是-fstack-protector的其他默认值? -
你是如何比较 asm 的?你是use
gcc -O3 -Sto get the compiler's actual asm output,还是反汇编了链接的二进制文件?或者您是否将二进制文件与cmp或其他东西进行了比较? -
@PeterCordes 地址空间布局随机化的一些人工制品是否可能会影响链接?不是随机化本身,因为这发生在加载时,而是根据一个操作系统支持的版本 X 和另一个操作系统支持的更高但兼容的版本 Y 对它的一些规定?
-
@Vroomfondel:也许吧。
--enable-default-pie使-pie和-fpie默认为可执行文件和库启用 ASLR。 (见我的第一条评论)。除此之外,我认为相同的 gcc 版本正在做相同的 asm。不同版本的 binutils 可能会以不同方式设置 ELF 标头中的某些位,但 OP 询问的是 asm 差异,而不是二进制差异。不同的做ASLR的方式还是只需要PIC代码,所以区别只是-fpie与否。
标签: gcc assembly compilation operating-system