确定使用哪个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通常是浪费时间。请参阅如何从GCC / c装配件输出中消除“噪音”?-特别是与Matt Godbolt的CPPcon演讲的链接。)
选择C或C ++作为Godbolt的“语言”;您将在Ubuntu systmem上安装gcc和g ++ 4.8.4。
以后的Ubuntu版本将-fPIE
作为默认选项的一部分启用,因此您还必须在Godbolt上手动启用它以匹配您在本地看到的内容。但是我认为14.04太旧了。
(我们可以说这是x86-64,因为堆栈指针是RSP而不是ESP。是的,除非您使用,否则x86上的GCC默认为AT&T语法-masm=intel
。Godbolt编译器资源管理器默认为Intel,您可以切换该输出选项。这只是一个尽管同一机器指令的文本语法不同;但是如果您知道如何阅读,则两者无关。)
这可能是Godbolt会略有不同版本的头比你在当地得到编译; 我认为其安装程序使用一次安装中的标头而不是每种都有自己的标头来进行不同的编译器安装。不过,我对此可能是错的。通常没关系。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句