एकाधिक कॉलिंग सम्मेलनों के लिए संकलित करें

मैं इंटेल कंपाइलर से बाहर आने वाले कुछ लिनक्स कोड देख रहा हूं। ऐसा लगता है कि एक बार में 2 कॉलिंग सम्मेलनों के लिए कार्यों को संकलित किया जा रहा है। नक्शा फ़ाइल में इस तरह के कई फ़ंक्शन नाम जोड़े हैं:

0x0000000008000000   __foo
0x0000000008000008   __foo.

कार्यों के जोड़े के बीच ऑफसेट 4, 8, या 12 बाइट्स है। उनमें से प्रत्येक 1, 2, या 3 mov निर्देशों से मेल खाता है जो इस तरह के रजिस्टरों को स्टैक तर्क ले जा रहे हैं:

__foo:
mov     eax, [esp+4]
mov     edx, [esp+8]
__foo.:
push    ebp
...

उन निर्देशों के बाद, यह regparm सम्मेलन शुरू होता है का उपयोग कर एक समारोह की तरह दिखता है।

क्या इंटेल कंपाइलर दो अलग-अलग कॉलिंग सम्मेलनों के साथ कार्यों को उत्पन्न करता है और फिर दिए गए कॉलर के लिए जो भी प्रवेश पता सही है उसका उपयोग करें?

0
कोड को संकलित करने के लिए आप किस विकल्प का उपयोग कर रहे हैं?
जोड़ा लेखक mcleod_ideafix, स्रोत
मुझे नहीं पता। एक ग्राहक यह कोड प्रदान कर रहा है। मैं यह समझने की कोशिश कर रहा हूं कि उन्हें अपनी बिल्ड सेटिंग्स को बदलने के बिना उन्हें बताएं कि वे क्या हैं।
जोड़ा लेखक mike663, स्रोत

1 उत्तर

दरअसल, मैं कहूंगा कि आपने खुद को इस सवाल का जवाब दिया है:

क्या इंटेल कंपाइलर दो अलग-अलग कॉलिंग के साथ फ़ंक्शन उत्पन्न करता है   सम्मेलन और उसके बाद जो भी प्रवेश पता सही है उसका उपयोग करें   दिया गया कॉलर?

Foo फ़ंक्शन को __regcall विशेषता के साथ घोषित किया प्रतीत होता है। मेरा शिक्षित अनुमान यह है कि आपको शायद डेबग प्रोफाइल का उपयोग करके अपना प्रोग्राम संकलित करना होगा, क्योंकि स्टैक फ्रेम आधारित कॉलिंग सम्मेलन कुछ जानकारी को अधिक आसानी से उपलब्ध कराने की अनुमति देता है।

0
जोड़ा