2016-05-02 22 views
0

セグメンテーションフォルトが発生しています。私はvarargs関数を呼び出そうとしていません。デバッガ(Nemiver/GDBとEDBの両方)では、faulty命令はスタックにあるmovaps xmmword ptr [rbp-288], xmm7rbp == 0x00007ffd0e16ba78です。 xmm70です(問題がある場合)。不思議なSegfault

命令は.text:00401d10buffer_appendfの機能にあります。

Online Disassembler

Binary Download

+0

これはおそらく、あなたがスタックアラインメントを乱したことを意味します。 'movaps'はオペランドの16バイト境界整列を必要とし、ほとんどの呼び出し規則はそれを保証します。 – Jester

+0

スタックのサイズが小さくなったので、スタックが8ビット境界になっていることを保証することができると仮定して、16バイトのアライメントを保証するために、 'とrsp 0xff ... f0'を使用できますか? –

+0

はい、根本的な原因は、あなたが実際にどこかでアライメントを実際に乱してしまったことです。確かに、あなたは欠陥の位置合わせを修正することができますが、それは間違った解決策です。原因は 'parallisp_main'だと思われます。 – Jester

答えて

1

movapsオペランドの16バイトアライメントを必要とし、ほとんどの呼び出し規約はそれを確認してください。根本的な原因は、あなたが実際にそれがparallisp_mainのITの表情で、どこかに早くアライメントをめちゃめちゃことです:

0x0000000000400a95 <+159>: pop %rbx 
0x0000000000400a96 <+160>: callq *%rax 
0x0000000000400a98 <+162>: callq 0x4007e0 <[email protected]> 
0x0000000000400a9d <+167>: retq 

がちょうどretq前にアライメントを修正する必要があるためにpop %rbxを移動します。

関連する問題