【发布时间】:2011-04-16 07:30:27
【问题描述】:
我遇到了崩溃,在调查时我发现自己完全被以下代码阻止:
0000000000000a00 <_IO_vfprintf>:
a00: 55 push %rbp
a01: 48 89 e5 mov %rsp,%rbp
a04: 41 57 push %r15
a06: 41 56 push %r14
a08: 41 55 push %r13
a0a: 41 54 push %r12
a0c: 53 push %rbx
a0d: 48 81 ec 48 06 00 00 sub $0x648,%rsp
a14: 48 89 95 98 f9 ff ff mov %rdx,0xfffffffffffff998(%rbp)
这是通过在 64 位 Linux x86 系统上运行 objdump --disassemble /usr/lib64/libc.a 生成的,然后搜索输出。这是AT&T syntax,所以目的地在右边。
具体来说,我不明白最后一条指令。在函数触及该寄存器之前,它似乎正在将rdx 寄存器的值写入堆栈某处(很远,很远)的内存中。对我来说,这没有任何意义。
我尝试阅读调用约定,现在我最好的理论是rdx 用于参数,因此代码基本上是直接“返回”参数值。这不是函数的结束,所以它当然没有真正返回。
【问题讨论】:
标签: linux assembly x86-64 calling-convention