我遇到了崩溃,并在调查时发现我完全被以下代码阻塞:
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
,然后search输出来生成的。 这是AT&T的语法 ,所以目的地在右边。
具体来说,我不明白最后的指示。 在函数触及寄存器之前,似乎是将rdx
寄存器的值写入堆栈的某处(远或远处)。 对我来说,这没有任何意义。
我尝试阅读调用约定,现在我最好的理论是rdx
用于参数,所以代码基本上是直接“返回”参数值。 这不是函数的结尾,所以当然不是真的返回。
是的,这是一个参数。 Linux使用的ABI以明显且易于记忆的顺序%rdi
, %rsi
, %rdx
, %rcx
分配多达6个“INTEGER”(<= 64位整数或指针) %r8
, %r9
。
堆栈帧是1648字节( sub $0x648,%rsp
声明1608字节,再加上5个64位寄存器之前被推), 0xfffffffffffff998
是-1640。
所以代码将靠近堆栈底部的第三个参数存储。
(注意:Windows 64位ABI与Linux不同。)