J'essaie d'obtenir des informations sur les conventions d'appel à partir des informations DWARF. Plus spécifique, je veux savoir quels registres/emplacements de pile sont utilisés pour passer des arguments aux fonctions. Mon problème est que je reçois des informations erronées dans certains cas de DWARF. L'exemple que je me sers est le suivant « code C »:Obtention des conventions d'appel à partir de DWARF info
int __attribute__ ((fastcall)) __attribute__ ((noinline)) mult (int x, int y) {
return x*y;
}
Je compile cet exemple en utilisant la commande suivante:
gcc -c -g -m32 test.c -o test.o
Maintenant, quand j'utilise la commande suivante pour obtenir la décharge naine:
dwarfdump test.o
Je reçois les informations suivantes sur cette fonction:
< 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
En regardant les entrées DW_AT_location, il y a un décalage par rapport à la base de l'image. Cela implique qu'ils sont des arguments de mémoire, mais que la convention d'appel réelle "fastcall" force leur passage dans des registres. En regardant le désassemblage du fichier d'objet produit, je peux voir qu'ils sont copiés des registres aux emplacements de pile au point d'entrée de la fonction. Y a-t-il un moyen de savoir à partir du vidage nain - ou de toute autre manière - où les arguments sont passés lors de l'appel initialement?
Merci,