【发布时间】:2020-08-01 18:48:22
【问题描述】:
假设我有以下 C 程序:
int main() {
int a = 1;
int b = 2;
return a + b;
}
在Compiler Explorer 上编译这个给了我:
main:
pushq %rbp
movq %rsp, %rbp
movl $1, -4(%rbp)
movl $2, -8(%rbp)
movl -4(%rbp), %edx
movl -8(%rbp), %eax
addl %edx, %eax
popq %rbp
ret
这(有点)类似于通过gcc 编译给我的东西,至少对于main 部分。但是,这不会作为“独立”编译,例如,如果我将 asm 复制粘贴到文件 gb.s 并运行 $ gcc gb.s 我会收到错误:
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol...
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line): relocation 0 has invalid symbol index 2
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
-- 除非我还在顶部包含.globl,例如:
.globl main
由此,我有两个问题:
- 为什么 godbolt 编译器不在顶部包含它,或者其他什么东西使它自包含?
- 有没有办法运行
gcc并告诉它main是主要/全局部分而不将.globl main放在顶部?
【问题讨论】:
-
“我得到一个错误”你不认为你应该把它全部包含进去吗?
-
godbolt 也确实包含该内容,但您已将其过滤掉。请参阅“过滤器”选项。请注意,godbolt 只是为您运行
gcc -S并格式化输出。 -
为什么 Godbolt 编译器不在顶部包含它,或者其他什么东西使它自包含? - 因为这与它的目的相反。它正在删除样板,因此您可以看到有趣的部分。 How to remove "noise" from GCC/clang assembly output?。如果你了解 asm,你就知道函数在
.text中,并且是带有.type函数的全局符号。该数据位于.rodata或.data中,具体取决于只读与否。