我在尝试调用varargs函数时遇到了一个无法解决的分段错误。在调试器(Neiver/GDB和EDB)中,错误指令是堆栈上的movaps xmmword ptr [rbp-288], xmm7
和rbp == 0x00007ffd0e16ba78
。如果重要的话,xmm7
就是0
。
指令位于.text:00401d10
,位于buffer_appendf
函数中。
在线反汇编
二进制下载
movaps
需要操作数的16字节对齐,大多数调用约定都能确保这一点。根本原因是你实际上在早些时候把对齐搞砸了,从外观上看是parallisp_main
:
0x0000000000400a95 <+159>: pop %rbx
0x0000000000400a96 <+160>: callq *%rax
0x0000000000400a98 <+162>: callq 0x4007e0 <free@plt>
0x0000000000400a9d <+167>: retq
将pop %rbx
移动到刚好在retq
之前应该可以修复对齐。