2013-07-03 7 views
10

मेरे पास एक सी ++ प्रोजेक्ट है जो सी ++ लाइब्रेरी का उपयोग करता है जिसे मैंने भी लिखा था। मैं सबकुछ बनाने के लिए क्लैंग ++ 3.3 का उपयोग कर रहा हूं। पुस्तकालय में प्रत्येक फ़ाइल के रूप मेंएलएलवीएम बिटकोड पुस्तकालयों का निर्माण और उपयोग

clang++ -c -O -emit-llvm somefile.cpp -o somefile.bc 

संकलित किया गया है मैं तो इतना

llvm-link -o MyLibrary.bc somefile.bc someotherfile.bc etc.bc 

मैं की तरह एक बिट कोड फ़ाइल में सभी पुस्तकालय * .bc फ़ाइलें गठबंधन करने के लिए LLVM-लिंक का उपयोग कर रहा ऑब्जेक्ट फ़ाइलों का संग्रह बनाने के समान होने के लिए इसे संकल्पनात्मक बनाना, लेकिन मुझे नहीं लगता कि यह कैसे काम कर रहा है इस पर आधारित है।

फिर मैं उपरोक्त में एक समान कमांड का उपयोग करके अपने प्रोजेक्ट की स्रोत फ़ाइलों को संकलित करता हूं। मैं तो इस

llvm-link -o app.bc1 main.bc x.bc y.bc path/to/MyLibrary.bc 

अगला की तरह एक बिट कोड फ़ाइल में पुस्तकालय बिट कोड फ़ाइल के साथ इन गठबंधन करने के लिए, LLVM-लिंक (फिर) का उपयोग मैं एक देशी वस्तु फ़ाइल

llc -filetype=obj app.bc1 -o app.o 
में app.bc1 संकलन

अंत में मैं उपयोग बजना फिर से इस देशी वस्तु फ़ाइल से जोड़ने के लिए ++ (और इस तरह के सी ++ मानक पुस्तकालय, आदि जैसे अन्य देशी पुस्तकालयों मैं की जरूरत है, के खिलाफ)

clang++ app.o -o app 

हालांकि, HAP प्रतीत होता है पेंसिंग यह है कि जब मैं एप्लिकेशन के बिट कोड को लिंक-लिंक करता हूं तो MyLibrary.bc की संपूर्ण सामग्री परिणाम में शामिल की जाती है। इस प्रकार अंतिम लिंकिंग को लाइब्रेरी घटकों द्वारा किए गए संदर्भों को हल करने की आवश्यकता है जिन्हें मैं वास्तव में उपयोग नहीं कर रहा हूं।

मैं जो करना चाहता हूं वह MyLibrary.bc से निकाला जाता है केवल मेरे लिए आवश्यक बिट कोड फाइलें। मुझे लगता है कि एक llvm-ar प्रोग्राम है लेकिन इसके बारे में पढ़ने में मुझे यह इंप्रेशन नहीं मिलता है कि इससे यहां मदद मिलेगी। मैंने अनुमान लगाया कि मैं पुस्तकालय को llvm-ar के बजाय llvm-ar के साथ जोड़ सकता हूं, लेकिन मैं इसे समझ नहीं सकता। मुझे आशा है कि मुझे बस थोड़ा धक्का चाहिए :)

+0

आपके लिंक चरण में अनुकूलन या मृत-स्ट्रिपिंग का कोई संकेत शामिल नहीं है जिसे किया जाना चाहिए। क्या आपने ऐसा करने के लिए ध्वज जोड़ने का प्रयास किया था? –

+0

क्या आप llvm-link पर एक ध्वज का मतलब है? यहां प्रलेखन http://llvm.org/docs/CommandGuide/llvm-link.html ऐसे किसी ध्वज के बारे में बात नहीं करता है। मैंने -dce और -adce झंडे के साथ ऑप्ट का उपयोग करने का प्रयास किया लेकिन मेरे प्रभाव पर कोई प्रभाव नहीं पड़ा। अंतिम लिंक पर –

+0

नहीं। एक लाइब्रेरी को अलग करना मृत वास्तव में समझ में नहीं आता है। –

उत्तर

4

संपादित करें: यह वास्तव में ar है जो इसे काम करता है।

थोड़ी देर हो चुकी है लेकिन अभी भी किसी के लिए प्रासंगिक हो सकता है, हम bitcode से जोड़ने के लिए LLVM प्लगइन के साथ ar और ld.gold का उपयोग करें:

ar r --plugin /usr/lib64/llvm/LLVMgold.so library.a <files...> 
ld.gold --plugin /usr/lib64/llvm/LLVMgold.so -plugin-opt emit-llvm main.bc library.a 

बेशक LLVMgold.so के लिए पथ अलग हो सकता है। इस तरह परिणामस्वरूप। बीसी को सिर्फ प्रतीकों की आवश्यकता है।

+0

व्लादिमीर, क्या इस प्रकृति का प्लगइन लोड एक प्रक्रिया में इस्तेमाल किया जा सकता है जैसे एओपी बाइटकोड उपकरण? –

+0

आप एलएलवीएम के ऑप्ट का उपयोग करके बिटकोड इंस्ट्रूमेंटेशन कर सकते हैं, मेरा मानना ​​है कि इसमें प्लगइन के लिए भी समर्थन है (इस मामले में एलएलवीएम बिटकोड पर कस्टम पास)। –

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