确定服务器使用哪个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, -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/选择最接近的语言进行在线编译,但是我不确定应该选择哪种语言(甚至无法确定如何确定)。基本上,我所知道的只是“它看起来像ATT语法”。如何解决?
GCC通过元数据标识自己;在asm中,这是.ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4"
指令。
您可能已经通过gcc -v
看到了同一件事,只是打印了GCC版本。
这告诉您您的服务器正在使用旧的旧版GCC 4.8.4。 (如果您关心优化问题,我真的建议您使用更新的编译器;例如,gcc 8引入了更简单的自动矢量化功能,该方法对对齐的数组更好,并且可以让硬件仅使用未对齐的负载来处理未对齐的问题。)
因此,在https://godbolt.org/上,您可以通过将C编译器版本设置为x86-64 GCC 4.8.4,并使用-fstack-protector-strong
来获得与本地相同的asm。”(因为Ubuntu配置其GCC以使用该选项)。通常,您还应该至少使用-Wall -O2
或-O3
;查看未优化的asm通常是浪费时间。参见How to remove "noise" from GCC/clang assembly output?-特别是指向Matt Godbolt的CPPcon演讲的链接。)
选择C或C ++作为Godbolt上的“语言”;您将在Ubuntu systmem上安装gcc和g ++ 4.8.4。
较新的Ubuntu版本启用-fPIE
((我们可以说这是x86-64,因为堆栈指针是RSP而不是ESP。是的,除非您使用-masm=intel
,否则x86上的GCC默认为AT&T语法。Godbolt编译器资源管理器默认为Intel,您可以切换该输出选项。但是,对于同一机器指令,这只是不同的文本语法;如果您知道如何阅读,则两者之间的差异是无关紧要的。)
这是[[可能
,Godbolt将使用与本地版本稍有不同的头文件版本进行编译;我认为其安装程序使用一次安装中的标头而不是每种都有自己的标头来进行不同的编译器安装。不过,我对此可能是错的。通常没关系。