Tôi đang cố gắng lấy thông tin về các quy ước gọi điện từ thông tin DWARF. Cụ thể hơn, tôi muốn nhận được vị trí đăng ký/ngăn xếp nào được sử dụng để chuyển đối số cho các hàm. Vấn đề của tôi là tôi nhận được thông tin sai bằng cách nào đó trong một số trường hợp từ DWARF dump. Ví dụ tôi đang sử dụng là sau "mã C":Nhận các quy ước về cuộc gọi từ thông tin DWARF
int __attribute__ ((fastcall)) __attribute__ ((noinline)) mult (int x, int y) {
return x*y;
}
tôi biên dịch ví dụ này bằng cách sử dụng lệnh sau:
gcc -c -g -m32 test.c -o test.o
Bây giờ khi tôi sử dụng lệnh sau đây để có được những bãi lùn:
dwarfdump test.o
tôi nhận được thông tin sau về chức năng này:
< 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
Nhìn vào các mục nhập DW_AT_location, nó là một số bù đắp từ cơ sở khung. Điều này ngụ ý rằng chúng là các đối số bộ nhớ, nhưng các quy ước gọi là "fastcall" thực thi truyền chúng thành các thanh ghi. Bằng cách xem xét việc tháo gỡ tệp đối tượng được tạo ra, tôi có thể thấy chúng được sao chép từ sổ đăng ký đến các vị trí ngăn xếp tại điểm vào của hàm. Có cách nào để biết từ bãi lùn - hay sử dụng bất kỳ cách nào khác-- nơi các đối số được truyền vào cuộc gọi ban đầu?
Xin cảm ơn,