2011-12-28 19 views
5

से बाइनरी पीढ़ी एलएलवीएम के सी ++ पक्ष से निष्पादन योग्य बाइनरी कैसे उत्पन्न करती है?एलएलवीएम

मैं वर्तमान में एक खिलौना संकलक लिख रहा हूं, और मुझे पूरा यकीन नहीं है कि आईआर से निष्पादन योग्य बनाने का अंतिम चरण कैसे करें।

एकमात्र समाधान जो मैं वर्तमान में देखता हूं वह बिटकोड लिखना है और फिर system या इसी तरह का उपयोग कर llc को कॉल करना है। क्या इसके बजाय C++ इंटरफ़ेस से ऐसा करने का कोई तरीका है?

ऐसा लगता है कि यह एक आम सवाल होगा, लेकिन मुझे इस पर कुछ भी नहीं मिल रहा है।

उत्तर

3

एलएलवीएम इस कार्य को करने के लिए आवश्यक लिंकर को शिप नहीं करता है। यह केवल असेंबलर के रूप में लिख सकता है और फिर इसके साथ निपटने के लिए सिस्टम लिंकर का आह्वान कर सकता है। यह देखने के लिए कि यह कैसा किया गया है, आप llvm-ld का स्रोत कोड देख सकते हैं।

+0

धन्यवाद, llvm-ld कोड बिल्कुल वही है जो मुझे चाहिए था। – cobbal

+1

यदि आप llvm-ld के दस्तावेज़ को पढ़ते हैं, तो यह कहता है कि इसका आउटपुट अभी भी बाइटकोड है, मूल बाइनरी नहीं। बाइटकोड यह आउटपुट वास्तव में इस अर्थ में जुड़ा हुआ है कि आउटपुट में सभी इनपुट मौजूद हैं। एलडी के प्रतिस्थापन में गिरावट के रूप में कार्य करने के लिए, llvm-ld को सामान्य a.out फ़ाइल उत्पन्न करनी होगी, लेकिन यह मूल निष्पादन योग्य भी नहीं है। यह एक शेल स्क्रिप्ट है जो एलएलवीएम की लिली उपयोगिता का आह्वान करती है जो तब बाइटकोड निष्पादित करती है (या तो इसके दुभाषिया के माध्यम से या जेआईटी संकलन के माध्यम से)। यदि आप वास्तव में निष्पादन योग्य चाहते हैं, तो आपको अंततः अपने एलएलवीएम आईआर या बाइटकोड को असेंबली में संकलित करना होगा और इसे जीसीसी के माध्यम से चलाएं। – mgadda

संबंधित मुद्दे