【问题标题】:Mysterious Segfault神秘的段错误
【发布时间】:2016-05-02 19:08:37
【问题描述】:

我在尝试调用可变参数函数时遇到了一个分段错误,我无法弄清楚。在调试器(Nemiver/GDB 和EDB)中,错误指令是堆栈上的movaps xmmword ptr [rbp-288], xmm7rbp == 0x00007ffd0e16ba78xmm70,如果重要的话。

指令位于.text:00401d10,在buffer_appendf 函数中。

Online Disassembler

Binary Download

【问题讨论】:

  • 这可能意味着你搞砸了堆栈对齐。 movaps 要求操作数对齐 16 字节,并且大多数调用约定都确保了这一点。
  • 因为 x86 堆栈会向下增长,假设我 可以 保证堆栈具有 8 位对齐,我是否可以只 and rsp 0xff...f0 来确保 16 字节对齐?跨度>
  • 是的,但根本原因是您实际上在早些时候搞砸了对齐方式。当然,您可以在故障处修复对齐,但这是错误的解决方案。看起来罪魁祸首是parallisp_main

标签: assembly segmentation-fault


【解决方案1】:

movaps 要求操作数对齐 16 字节,大多数调用约定都确保了这一点。根本原因是您实际上在之前的某个地方弄乱了对齐方式,看起来它是parallisp_main

0x0000000000400a95 <+159>:  pop    %rbx
0x0000000000400a96 <+160>:  callq  *%rax
0x0000000000400a98 <+162>:  callq  0x4007e0 <free@plt>
0x0000000000400a9d <+167>:  retq   

pop %rbx 移动到retq 之前应该可以解决对齐问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2017-04-20
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多