如何确定我的服务器正在使用哪个 asm

How to figure out which asm my server is using

确定 asm 服务器正在使用的最直接方法是什么?例如,我有以下 C 程序:

int main(void) {                                                                                                                                 
    int i = 4;
    return i;
}

并通过 $ gcc -S main.c 编译成汇编,我得到:

  1   .file "main.c"                                                                                                                                 
  2   .text
  3   .globl  main
  4   .type main, @function
  5 main:
  6 .LFB0:
  7   .cfi_startproc
  8   pushq %rbp
  9   .cfi_def_cfa_offset 16
 10   .cfi_offset 6, -16
 11   movq  %rsp, %rbp
 12   .cfi_def_cfa_register 6
 13   movl  , -4(%rbp)
 14   movl  -4(%rbp), %eax
 15   popq  %rbp
 16   .cfi_def_cfa 7, 8
 17   ret
 18   .cfi_endproc
 19 .LFE0:
 20   .size main, .-main
 21   .ident  "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4"
 22   .section  .note.GNU-stack,"",@progbits

我想使用https://godbolt.org/到select最接近在线编译的语言,但我不确定我应该select(甚至不知道如何弄清楚)我如何确定)。基本上我只知道"it looks like ATT syntax"。我该如何解决?

GCC 通过元数据识别自己;在 asm 中,这是 .ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4" 指令。

您可以通过 gcc -v 看到同样的事情,只需打印您的 GCC 版本。

这表明您的服务器正在使用旧的 GCC 4.8.4。 (如果您关心优化,我真的建议您使用更新的编译器;例如,gcc 8 引入了更简单的 auto-vectorization,它更适合对齐的数组,并让硬件仅通过使用未对齐的加载来处理错位。)

继续 https://godbolt.org/ you can get identical asm to what you get locally by setting the C compiler version to x86-64 GCC 4.8.4, and using -fstack-protector-strong. (Because Ubuntu configures their GCC to use that option). Normally you should also use -Wall -O2 at least, or -O3; looking at un-optimized asm is usually a waste of time. See How to remove "noise" from GCC/clang assembly output? - 特别是 link 对 Matt Godbolt 的 CPPcon 演讲。)

选择 C ​​或 C++ 作为 Godbolt 上的 "language";你将在 Ubuntu 系统内存上安装 gcc 和 g++ 4.8.4。

以后的 Ubuntu 版本启用 -fPIE 作为默认选项的一部分,因此您还必须在 Godbolt 上手动启用它以匹配您当地见。但我认为 14.04 太旧了。

(我们可以看出这是 x86-64,因为堆栈指针是 RSP 而不是 ESP。是的,除非您使用 -masm=intel,否则 x86 上的 GCC 默认为 AT&T 语法。Godbolt 编译器资源管理器默认为 Intel您可以切换该输出选项。不过,这只是相同机器指令的不同文本语法;如果您知道如何阅读两者,则差异无关紧要。)

可能 Godbolt 编译的 header 版本与您在本地获得的版本略有不同;我认为它的设置有不同的编译器安装,使用来自一个安装的 headers 而不是每个都有自己的。不过,我可能错了。平时就好了。