から呼び出し規約を取得する私は、DWARF情報から呼び出し規則についての情報を取得しようとしています。具体的には、関数に引数を渡すために使用されるレジスタ/スタックの場所を取得したい。私の問題は、DWARFダンプから何らかの理由で間違った情報が得られることです。ドワーフダンプを取得するために今、私は、次のコマンドを使用する場合DWARF情報
gcc -c -g -m32 test.c -o test.o
:
int __attribute__ ((fastcall)) __attribute__ ((noinline)) mult (int x, int y) {
return x*y;
}
私は、次のコマンドを使用してこの例をコンパイルします。私は使用しています例は、以下の「Cコード」である
< 2><0x00000042> DW_TAG_formal_parameter
DW_AT_name "x"
DW_AT_decl_file 0x00000001 /home/khaled/Repo_current/trunk/test.c
DW_AT_decl_line 0x00000001
DW_AT_type <0x0000005b>
DW_AT_location DW_OP_fbreg -12
< 2><0x0000004e> DW_TAG_formal_parameter
DW_AT_name "y"
DW_AT_decl_file 0x00000001 /home/khaled/Repo_current/trunk/test.c
DW_AT_decl_line 0x00000001
DW_AT_type <0x0000005b>
DW_AT_location DW_OP_fbreg -16
0123:
dwarfdump test.o
私はこの機能について、以下の情報を取得していますDW_AT_locationエントリを見ると
、それはフレームベースからのオフセットいくつかあります。これはメモリ引数であることを意味しますが、実際の呼び出し規約 "fastcall"はそれらをレジスタに渡します。生成されたオブジェクトファイルの逆アセンブリを見ると、それらが関数のエントリポイントでレジスタからスタック位置にコピーされていることがわかります。矮小ダンプから知る方法はありますか?または他の方法を使用します - 最初に引数が渡される場所はありますか?
おかげで、