我有一个简单的 C 语言函数,位于单独的文件 string.c 中:
void var_init(){
char *hello = "Hello";
}
编译:
gcc -ffreestanding -c string.c -o string.o
然后我使用命令
objdump -d string.o
查看反汇编列表。我得到的是:
string.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <var_init>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # b <var_init+0xb>
b: 48 89 45 f8 mov %rax,-0x8(%rbp)
f: 90 nop
10: 5d pop %rbp
11: c3 retq
我无法理解这个列表。 《从头开始编写操作系统》一书讲述了一些关于旧的反汇编的内容,并稍微揭开了其中的神秘面纱,但它们的 list 完全不同,我什至没有看到像作者所说的那样将数据解释为我的代码。
最佳答案
除了 @VladfromMoscow 的解释之外,我认为这可能对发布者了解编译为程序集时发生的情况而不是使用 objdump 来查看会有所帮助,因为这样可以更清楚地看到数据(IMO) RIP 相对寻址可能更有意义。
gcc -S x.s
产量
.file "x.c"
.text
.section .rodata
.LC0:
.string "Hello"
.text
.globl var_init
.type var_init, @function
var_init:
.LFB0:
pushq %rbp
movq %rsp, %rbp
leaq .LC0(%rip), %rax
movq %rax, -8(%rbp)
nop
popq %rbp
ret
.LFE0:
.size var_init, .-var_init
.ident "GCC: (Alpine 8.3.0) 8.3.0"
.section .note.GNU-stack,"",@progbits
关于c - 您如何解释这个反汇编列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59781879/