如何确定我的服务器正在使用哪个 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 而不是每个都有自己的。不过,我可能错了。平时就好了。
确定 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 而不是每个都有自己的。不过,我可能错了。平时就好了。