DWARF bilgilerinden çağrı kuralları hakkında bilgi almaya çalışıyorum. Daha spesifik olarak, argümanları işlevlere iletmek için hangi yazmaçların/yığın konumlarının kullanıldığını görmek istiyorum. Benim problemim, bazı durumlarda DWARF dökümünden yanlış bilgi alıyorum. cüce Dökümü almak için Şimdi aşağıdaki komutu kullandığınızdaDWARF bilgilerinden çağrıları çağırma
gcc -c -g -m32 test.c -o test.o
:
int __attribute__ ((fastcall)) __attribute__ ((noinline)) mult (int x, int y) {
return x*y;
}
aşağıdaki komutu kullanarak bu örneği derlemek: Ben kullanıyorum örnek aşağıdaki "C kodu" dir
< 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
bu işlevi hakkında aşağıdaki bilgileri alıyorum
DW_AT_location girişlerine bakıldığında, çerçeve tabanından bir miktar ofset. Bu onların bellek argümanları olduklarını ima eder, ancak gerçek çağrı kuralı "fastcall" güçleri onları kayıtlara geçirir. Üretilen nesne dosyasının sökülmesine bakarak, kayıtlardan işlevin giriş noktasında yığın konumlarına kopyalandıklarını görebiliyorum. Cüce çöplüğünden bilmenin bir yolu var mı - yoksa başka bir yolla-- argümanlar başlangıçta çağrıya geçtiğinde?
sayesinde