我想從DWARF信息獲取有關調用約定的信息。更具體地說,我想要得到哪些寄存器/堆棧位置被用來傳遞參數給函數。我的問題是,我在某些情況下從DWARF轉儲獲取某種錯誤的信息。我使用的例子是下面的「C代碼」:從DWARF信息獲取調用約定
gcc -c -g -m32 test.c -o test.o
現在,當我用下面的命令來獲得侏儒轉儲:
int __attribute__ ((fastcall)) __attribute__ ((noinline)) mult (int x, int y) {
return x*y;
}
我使用下面的命令編譯這個例子
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」強制將它們傳遞到寄存器。通過查看生成的目標文件的反彙編,我可以看到它們從寄存器複製到函數入口點的堆棧位置。有沒有一種方法可以從矮人轉儲中知道 - 或者以任何其他方式 - 最初在調用中傳遞參數的地方?
感謝,