引数付きの簡単なコンソールアセンブリプログラムを作成しようとしています。ここで些細なMacOSアセンブリ64ビットプログラムのスタックアライメントが正しくない
.section __TEXT,__text
.globl _main
_main:
movl $0, %edi
callq _exit
コンパイルとリンクのスクリプトです:ここでは、コードです
as test.s -o test.o
ld test.o -e _main -o test -lc
今プログラムセグメンテーションフォールトで失敗、または引数の個数に応じて、エラーなしで実行し、次のいずれか
$ ./test
Segmentation fault: 11
$ ./test 1
$ ./test 1 2
$ ./test 1 2 3
Segmentation fault: 11
$ ./test 1 2 3 4
$ ./test 1 2 3 4 5
Segmentation fault: 11
など。 LLDBの下
私はより多くの有益なエラーを参照してください。
確かProcess 16318 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
frame #0: 0x00007fffad14b2fa libdyld.dylib`stack_not_16_byte_aligned_error
libdyld.dylib`stack_not_16_byte_aligned_error:
-> 0x7fffad14b2fa <+0>: movdqa %xmm0, (%rsp)
0x7fffad14b2ff <+5>: int3
libdyld.dylib`_dyld_func_lookup:
0x7fffad14b300 <+0>: pushq %rbp
0x7fffad14b301 <+1>: movq %rsp, %rbp
、私はプログラムの最初の行で実行を停止した場合、私はスタックが16バイトは、いくつかの引数に整列されていないことを確認それは別のもののために整列されています。 System V ABI for AMD64の状態が、その:
The stack pointer holds the address of the byte with lowest address which is part of the stack. It is guaranteed to be 16-byte aligned at process entry.
は、私が何をしないのですか?
OS Xがいくつかの長さの引数に対してABIに違反しているようです。あなたはlibcなしで試したことがありますか?静的にリンクされたバイナリへのプロセスエントリで自分自身(デバッガを使って)のスタックアラインメントをチェックしてみましたか? 'syscall'は直接ですか? (または、終了ステータス= 'rsp&0xf'と' ./test 1 2 3; echo $? 'を設定してスタックの位置合わせを確認してください)。 –