2013-04-30 11 views
14

पर ठीक से काम नहीं करता है, मैं झुकाव के लिए एक नवागंतुक हूं, इसलिए शायद मैं कुछ मूर्खतापूर्ण कर रहा हूं। लेकिन मैंने यहां खोज सहित कई घंटों तक समाधान की तलाश की है, जहां मुझे डिस्ट्रो-प्रदत्त पैकेजों के साथ-साथ प्रश्नों को संबोधित करने के लिए प्रश्न नहीं मिला है। इस विवरण का विवरण फेडोरा 18 के लिए विशिष्ट है, लेकिन मुझे उबंटू 13.04 पर समान समस्याएं आ रही हैं, इसलिए समस्या फेडोरा के लिए विशिष्ट नहीं है। यह या तो मुझे या झुकाव है।क्लैंग लिंक-टाइम ऑप्टिमाइज़ेशन फेडोरा 18

समस्या: मैं लिंक-टाइम-ऑप्टिमाइज़ेशन के लाभ प्राप्त करने के लिए clang++ -flto का उपयोग करके एक सरल हैलो-वर्ल्ड प्रोग्राम संकलित करने का प्रयास कर रहा हूं। बिना -फ्लो यह ठीक काम करता है। इसके साथ-साथ यह लिंक करने में विफल रहता है। clang -flto -o hello hello.o -v के रूप में लागू पूर्ण लिंकर कमांड लाइन को देखने के लिए, मैं मिलता है:

$ clang++ -flto -o hello hello.o -v 
clang version 3.2 (tags/RELEASE_32/final) 
Target: x86_64-redhat-linux-gnu 
Thread model: posix 
"/usr/bin/ld" --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o hello /usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.7.2/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.7.2 -L/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../.. -L/lib -L/usr/lib -plugin /usr/bin/../lib/LLVMgold.so hello.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-redhat-linux/4.7.2/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/crtn.o 
/usr/bin/ld: /usr/bin/../lib/LLVMgold.so: error loading plugin 
/usr/bin/ld: /usr/bin/../lib/LLVMgold.so: error in plugin cleanup (ignored) 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

वहाँ दो समस्याओं होने लगते हैं:

  1. बजना ++ /usr/bin/ld के रूप में लिंकर invokes, और कहा कि सोने लिंकर नहीं है। Fedora18 /usr/bin/ld.gold के रूप में सोना स्थापित करता है। मैंने /usr/local/bin/ld से /usr/bin/ld.gold से एक सिम्लिंक बनाने का प्रयास किया है, सत्यापित किया है कि which ld/usr/local/bin/ld कहता है, लेकिन क्लैंग ++ इसका उपयोग नहीं करता है। ऐसा लगता है कि/usr/bin/ld के लिए कड़ी मेहनत की जा रही है।

  2. क्लैंग ++ ने -plugin /usr/bin/../lib/LLVMgold.so के साथ लिंकर को बुलाया। यह गलत है, क्योंकि क्लैंग का फेडोरा वितरण /usr/lib64/llvm/LLVMgold.so पर रखता है।

मैं मैन्युअल रूप से निम्नलिखित में तोड़ मरोड़ के साथ ऊपर है कि लिंकर लाइन लागू की कोशिश की है:

  • -plugin /usr/lib64/llvm/LLVMgold.so साथ -plugin /usr/bin/../lib/LLVMgold.so बदलें। यह त्रुटि संदेश hello.o: file not recognized: File format not recognized उत्पन्न करता है। इसलिए गैर-सोने के लिंकर को प्लगइन के बारे में पता चल रहा है लेकिन .o के पास नहीं है जिसमें एलएलवीएम बिटकोड है।

  • /usr/bin/ld/usr/bin/ld.gold के साथ बदलें। यह काम करता है, एक निष्पादन योग्य उत्पन्न करता है जो अपेक्षित के रूप में चलता है।

  • उपरोक्त दोनों -plugin के बजाय --plugin के साथ। इस बदलाव से कोई फर्क नहीं पड़ता।

तो किसी ऐसे व्यक्ति के लिए सबसे अच्छा तरीका क्या है जो क्लैंग -फ्लो का उपयोग करने के लिए सिस्टम-प्रदत्त पैकेजों से चिपकना पसंद करता है? मुझे उम्मीद है कि एक कॉन्फ़िगरेशन फ़ाइल है, या अनियंत्रित विकल्प या पर्यावरण चर है जो मुझे इन्हें ओवरराइड करने देगा। या बेहतर, कि मुझे एक पैकेज याद आ रहा है और "यम इंस्टॉल ..." इसे ठीक कर देगा।

मैं सीधे लिंकर का आह्वान नहीं करना चाहूंगा, क्योंकि मेरे मेकफ़ाइल को सिस्टम ऑब्जेक्ट्स और पुस्तकालयों को जानने की आवश्यकता है कि उन्हें अनजान होना चाहिए (उदा। Crt1.o, crtbegin.o, crtend.o)। मैं खुद को क्लैंग भी बना सकता हूं, लेकिन मैं इसकी कॉन्फ़िगरेशन स्क्रिप्ट में कुछ भी नहीं देख रहा हूं जो मुझे लिंकर और प्लगइन के पथ को कॉन्फ़िगर करने देता है।

मैं फेडोरा 18. कंप्यूटर पर केवल गैर distro संकुल चल रहा हूँ गूगल क्रोम और VMware उपकरण (यह VMWare संलयन के अंदर एक अतिथि है) कर रहे हैं।प्रासंगिक फेडोरा संकुल के संस्करण (पूरे कंप्यूटर आज के रूप में "यम अद्यतन" है, 29-अप्रैल 2013):

$ yum list --noplugins installed binutils* clang* llvm* gcc* 
Installed Packages 
binutils.x86_64      2.23.51.0.1-6.fc18     @updates 
binutils-devel.x86_64    2.23.51.0.1-6.fc18     @updates 
clang.x86_64       3.2-2.fc18       @updates 
clang-devel.x86_64     3.2-2.fc18       @updates 
clang-doc.noarch      3.2-2.fc18       @updates 
gcc.x86_64       4.7.2-8.fc18      @fedora 
gcc-c++.x86_64      4.7.2-8.fc18      @fedora 
llvm.x86_64       3.2-2.fc18       @updates 
llvm-libs.x86_64      3.2-2.fc18       @updates 

उत्तर

7

एक उपयोगिता alternatives फेडोरा में नहीं है - यह सिस्टम पर एक और के साथ एक लिंकर subtitute लिए अनुमति देता है स्तर:

lib/चालक/Tools.cpp:

$ sudo alternatives --display ld 
ld - status is auto. 
link currently points to /usr/bin/ld.bfd 
/usr/bin/ld.bfd - priority 50 
/usr/bin/ld.gold - priority 30 
Current `best' version is /usr/bin/ld.bfd. 
$ sudo alternatives --set ld /usr/bin/ld.gold 

LLVMgold.so स्थान के बारे में आप केवल फेडोरा Bugzilla में एक बग, के बाद से पथ बजना स्रोतों में अंतर्निहित है रिपोर्ट कर सकते हैं एसटीडी :: स्ट्रिंग प्लगइन = ToolChain.getDrive आर()। Dir + "/../lib/LLVMgold.so";

फेडोरा लोग क्लैंग के स्रोत पैकेज में पैच लागू कर सकते हैं, या LLVMgold.so पर एक सिम्लिंक बना सकते हैं। अभी तक फेडोरा 20 में कोई बदलाव नहीं है।

+5

बस कुछ समय बचाने के लिए, जैसा कि आप देख सकते हैं, यह 'lib' में देख रहा है, न कि 'lib64'। मेरे लिए काम करने वाला सिम्लिंक 'sudo ln -s /usr/lib64/llvm/LLVMgold.so/usr/lib/LLVMgold.so' था। – Jerska

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