से कॉलिंग सम्मेलन प्राप्त करना मैं डीडब्ल्यूएआरएफ जानकारी से सम्मेलनों को कॉल करने के बारे में जानकारी प्राप्त करने की कोशिश कर रहा हूं। अधिक विशिष्ट, मैं यह जानना चाहता हूं कि कार्यों के लिए तर्क पारित करने के लिए कौन से रजिस्टरों/स्टैक स्थानों का उपयोग किया जाता है। मेरी समस्या यह है कि मुझे कुछ मामलों में डीडब्ल्यूएआरएफ डंप से कुछ गलत जानकारी मिल रही है।डीडब्ल्यूएआरएफ जानकारी
gcc -c -g -m32 test.c -o test.o
अब जब मैं निम्न आदेश का उपयोग बौना डंप पाने के लिए:
int __attribute__ ((fastcall)) __attribute__ ((noinline)) mult (int x, int y) {
return x*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
0123:
dwarfdump test.o
मैं इस समारोह के बारे में निम्नलिखित जानकारी हो रही है
DW_AT_ स्थान प्रविष्टियों को देखते हुए, यह फ्रेम आधार से कुछ ऑफसेट है। इसका तात्पर्य है कि वे स्मृति तर्क हैं, लेकिन वास्तविक कॉलिंग सम्मेलन "फास्टकॉल" उन्हें रजिस्टरों में पास करने के लिए मजबूर करता है। उत्पादित ऑब्जेक्ट फ़ाइल के डिस्सेप्लर को देखकर, मैं देख सकता हूं कि फ़ंक्शन के प्रवेश बिंदु पर स्थानों को स्टैक करने के लिए उन्हें रजिस्टरों से कॉपी किया गया है। बौने डंप से किसी अन्य तरीके से जानने का कोई तरीका है - जहां शुरुआत में कॉल पर तर्क पारित किए जाते हैं?
धन्यवाद,