8

クラッシュが発生しました。調査中に、次のコードによって完全にブロックされていることがわかりました。

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)

これはobjdump --disassemble /usr/lib64/libc.a、64 ビット Linux x86 システムで実行し、出力を検索することによって生成されます。これはAT&T の構文なので、宛先は右側にあります。

具体的には、最後の指示がわかりません。rdx関数がそのレジスタに触れる前に、レジスタの値をスタックのどこか(遠く、遠く)にメモリに書き込んでいるようです。私には、これは意味がありません。

私は呼び出し規約を読んでみましたが、私の最良の理論はrdx、パラメーターに使用されているため、コードは基本的にパラメーター値を直接「返す」ことです。これは関数の終わりではないので、もちろん実際には戻りません。

4

1 に答える 1

13

はい、それはパラメータです。Linuxで使用されるABIは、最大6つの「INTEGER」(<= 64ビット整数またはポインター)タイプのパラメーターを、わかりやすく覚えやすい順序%rdiでレジスターに割り当てます。%rsi%rdx%rcx%r8%r9

スタックフレームは1648バイト(sub $0x648,%rsp1608バイトを要求し、さらに5つの64ビットレジスタがその前にプッシュされています)で、0xfffffffffffff998-1640です。

したがって、コードはスタックフレームの下部近くに3番目のパラメーターを格納しています。

(注:Windows 64ビットABIはLinuxのものとは異なります。)

于 2010-09-23T18:19:13.500 に答える