2008-10-23 23 views
17

मैं कोड :: ब्लॉक आईडीई के साथ जीसीसी का उपयोग करके निर्मित एक निष्पादन योग्य में विशेष स्ट्रिंग $ ओरिजिन युक्त आरपीएटीएच को जोड़ने का प्रयास कर रहा हूं। मैं

-Wl,-R$ORIGIN 
परियोजना के लिए लिंकर विकल्पों में

निर्दिष्ट किया है, लेकिन जीसीसी के लिए कमांड लाइन उत्पादन गलत है (स्पष्टता के लिए छीन लिया):

g++ -Wl,-R 

इस तर्क को निर्दिष्ट करने के लिए सही तरीका क्या है कोड :: ब्लॉक के लिए?

+0

संबंधित है, लेकिन specifc नहीं संहिता :: ब्लाकों के लिए: http://stackoverflow.com/q/6324131/257299 – kevinarpe

उत्तर

34

जो भी टोकन $ ऑरिजिन बनाने का फैसला करता है वह एक बुराई है जो प्रोग्रामर नरक में एक विशेष स्थान के योग्य है। चूंकि '$' बैश और अन्य स्क्रिप्टिंग भाषाओं जैसे विशेष चरित्र है, इसलिए सावधानी से बचने तक यह सब कुछ खराब कर देता है। इससे भी बदतर, आप जिस निर्माण वातावरण का उपयोग कर रहे हैं उसके आधार पर, ठीक से बचने के तरीके के बारे में बताए गए बदलावों में बदलाव आएगा।

बैश में, आप $ के सामने एक बैकस्लैश छड़ी की जरूरत है:

-Wl,-R\$ORIGIN 

कोड :: ब्लाकों जाहिरा तौर पर भी विशेष रूप में $ व्यवहार करता है। फिर, जो भी subprocess नियंत्रक कोड :: ब्लॉक बैकस्लैश विशेष के रूप में व्यवहार करने के लिए आदेश भेजता है। इसलिए, बैकस्लैश और $ दोनों को ठीक से बचने के लिए दोगुनी होने की आवश्यकता है। इसलिए, कोड :: ब्लाकों लिंकर सेटिंग्स में, आप निर्दिष्ट करना होगा: ...

-Wl,-R\\$ORIGIN 

निर्माण लॉग में, लेकिन खोल वास्तव में भेज दिया जाता है:

-Wl,-R\\$$ORIGIN 

... जो आउटपुट:

-Wl,-R\$ORIGIN 

... जैसा ऊपर बताया गया है वांछित परिणाम उत्पन्न करता है।

क्या दर्द है।

+6

सिर्फ बुराई कमीने टिप्पणी ... इस मुद्दे मुझे दर्द की टन का कारण बना है – chotchki

+0

बिल्कुल सही टिप्पणी के लिए +1 , उसे नरक में सड़ना चाहिए .. 40 succubus उसे जांच कर के साथ। –

+0

क्या कोई तरीका है, एक निर्मित निष्पादन योग्य, अपने RPATH को बदलने के लिए? चूंकि यह ईएलएफ टेबल में सिर्फ एक स्ट्रिंग है, यह अनुचित प्रतीत नहीं होता है। आरपीएथ को $ ओरिजिन/याडा/याडा में सेट करना मुझे लगता है कि आप कुछ मौजूदा (संभवतः भयानक जटिल) निर्माण स्क्रिप्ट में जोड़ना चाहते हैं, और यदि उन्होंने लिंकर को विकल्प भेजने का कोई तरीका प्रदान किया है, तो महान, लेकिन , जैसा कि चर्चा की गई है, आपको भागने वाले नरक से निपटना होगा (अपने स्वयं के 'एलडी' रैपर को इसे छीनने में आसान हो सकता है)। ओटीओएच धुएं के बाद परिणामों पर आरपीएथ को संशोधित करता है? इतना कठिन नहीं है। यदि, ऐसा है, तो एक उपयोगिता है जो इसे कर सकती है ... – greggo

15

kblucks उत्तर के अलावा कोड: ब्लॉक के लिए प्रश्नों को संबोधित करता है: मेरे जैसे उन लोगों के लिए जो इस पृष्ठ पर ठोकर खा रहे हैं, मेक के साथ ऐसा करने के लिए कैसे खोज रहे हैं। चाल एक भागने चरित्र के रूप में एक अतिरिक्त $ हस्ताक्षर का उपयोग करने और उद्धरण के साथ संलग्न करने के लिए है:

-Wl,-R,'$$ORIGIN/../lib' 

पूर्ण विवरण यहाँ किया जा सकता है: Using ORIGIN for a dynamic runtime library search path

1

अपने निष्पादन योग्य एक विशाल द्वारा निर्मित किया जा रहा है जटिल स्क्रिप्ट पर्यावरण आपके द्वारा नहीं बनाया गया है, और आप setenv LD_RUN_PATH='$ORIGIN/../lib' के साथ चलने का प्रयास कर रहे हैं, इसके साथ आप इसमें शामिल नहीं होना चाहते हैं; कि अगर काम नहीं करता है, एक व्यावहारिक दृष्टिकोण ld के लिए एक आवरण बनाने के लिए है:

#!/bin/sh 
exec /usr/bin/ld -R '$ORIGIN/../lib' "[email protected]" 

... तो रास्ते पर है कि ठूंठ के साथ निर्माण कर रहे हैं। प्रैक्टिस में इसे .so फाइलें, या अन्य एक्जिक्यूटिव बनाने के लिए बुलाया जा सकता है, इसलिए आपको इसे एक और जटिल स्क्रिप्ट बनाने की आवश्यकता हो सकती है जो यह तय करता है कि आरपीएटीएच डालना है या नहीं। या, इसके बिना निर्माण, और साथ, और चेरी उठाओ।

(यहां "/ usr/bin/ld" एलडी है जो आम तौर पर चलाया जाता है, जो कहीं और हो सकता है। जीसीसी पथ से एलडी नहीं ले सकता है, जीसीसी पर्यावरण चर को ओवरराइड करने के लिए देख सकता है। माइलेज अलग-अलग। केवल एकल उपयोग। किसी भी अन्य दृष्टिकोण से कम भयानक नहीं है)।