DWARF情報から呼び出し規約に関する情報を取得しようとしています。具体的には、関数に引数を渡すために使用されるレジスタ/スタックの場所を取得したいと思います。私の問題は、DWARFダンプからいくつかのケースで間違った情報を取得していることです。私が使用している例は、次の「Cコード」です。
int __attribute__ ((fastcall)) __attribute__ ((noinline)) mult (int x, int y) {
return x*y;
}
次のコマンドを使用して、この例をコンパイルします。
gcc -c -g -m32 test.c -o test.o
次のコマンドを使用してドワーフダンプを取得すると、次のようになります。
dwarfdump test.o
この関数について次の情報を取得しています。
< 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
DW_AT_locationエントリを見ると、フレームベースからいくらかオフセットされています。これは、それらがメモリ引数であることを意味しますが、実際の呼び出し規約「fastcall」は、それらをレジスタに渡すことを強制します。生成されたオブジェクトファイルの逆アセンブリを見ると、それらがレジスタから関数のエントリポイントのスタック位置にコピーされていることがわかります。ドワーフダンプから(または他の方法を使用して)引数が最初に呼び出しで渡される場所を知る方法はありますか?
ありがとう、