2011-06-12 11 views
15

मुझे एक बाइनरी "सेलोपार्टी सर्वर" मिला है जिसे फ्रीबीएसडी मशीन पर रनटाइम पर libFoundation.so खोजने की आवश्यकता है। वे दोनों एक ही निर्देशिका में हैं। मैं लिंकर ध्वज "-rpath = $ ओरिजिन" का उपयोग कर CeeloPartyServer (एक क्रॉस कंपाइलर का उपयोग कर, एक और मंच पर संकलित)।

 
> readelf -d CeeloPartyServer |grep -i rpath 
0x0000000f (RPATH)      Library rpath: [$ORIGIN] 
> ls 
CeeloPartyServer Contents  Foundation.framework libFoundation.so 
> ./CeeloPartyServer 
/libexec/ld-elf.so.1: Shared object "libFoundation.so" not found, required by "CeeloPartyServer" 

जब मैं इसे चलाने का प्रयास करता हूं तो पुस्तकालय क्यों नहीं ढूंढ रहा है? मेरी सटीक लिंकर लाइन है: -lm -lmysql -rpath = $ मूल। मुझे पूरा यकीन है कि मुझे \ $ या इससे कुछ भी बचाना नहीं है क्योंकि मेरे रीडेल विश्लेषण वास्तव में दिखाते हैं कि लाइब्रेरी आरपीएथ $ ओरिजिन पर सेट है। मैं क्या खो रहा हूँ?

उत्तर

32

मुझे लगता है कि आप जीसीसी और बिनुटिल्स का उपयोग कर रहे हैं।

यदि आप करते हैं

readelf -d CeeloPartyServer | grep ORIGIN 

आप RPATH लाइन आप ऊपर पाया वापस मिलना चाहिए, लेकिन आप यह भी झंडे के बारे में कुछ प्रविष्टियों को देखना चाहिए। निम्नलिखित पुस्तकालय से है जो मैंने बनाया है।

0x000000000000000f (RPATH)    Library rpath: [$ORIGIN/../lib] 
0x000000000000001e (FLAGS)    ORIGIN 
0x000000006ffffffb (FLAGS_1)   Flags: ORIGIN 

आप FLAGS प्रविष्टियों में से किसी प्रकार का नहीं देख रहे हैं, तो आप शायद नहीं लिंकर मूल प्रसंस्करण की आवश्यकता होती है के रूप में वस्तु चिह्नित करने के लिए कहा है। Binutils ld के साथ, आप -z origin ध्वज पास करके ऐसा करते हैं।

मुझे लगता है कि आप लिंक को चलाने के लिए जीसीसी का उपयोग कर रहे हैं, इसलिए उस स्थिति में आपको 0 जीको अपनी जीसीसी लिंक लाइन में जोड़कर कंपाइलर के माध्यम से ध्वज पारित करने की आवश्यकता होगी।

+0

अपने सभी पूर्वानुमान सही हैं। मैं -ज मूल ध्वज का उपयोग नहीं कर रहा हूं, कभी भी इसे कहीं भी दस्तावेज नहीं देखा। अगर आपको इसका समाधान हो तो आपको बताएगा। – Nektarios

10

लिंकर इसे देखे जाने से पहले इस ध्वज से कितनी परतें गुजरती हैं, इस पर निर्भर करते हुए, आपको $$ORIGIN या यहां तक ​​कि \$$ORIGIN का उपयोग करने की आवश्यकता हो सकती है। आपको पता चलेगा कि आपके पास यह सही है जब readelf एक RPATH शीर्षलेख दिखाता है जो $ORIGIN/../lib या इसी तरह दिखता है। अतिरिक्त $ और बैकस्लैश सिर्फ $ को श्रृंखला में अन्य उपकरणों द्वारा संसाधित होने से रोकने के लिए हैं।

+4

बस दूसरों के लिए स्पष्टीकरण देने के लिए (जैसे स्वयं) जो RPATH से कम परिचित हैं: संकलन के दौरान RPATH सेट करते समय, 'LDFLAGS = "- Wl, -rpath,' \ $ \ $ ORIGIN '-Wl, -z, मूल" '; जहां 'echo $ LDFLAGS' दे देंगे: '-Wl, -rpath, '$$ मूल' -Wl, -z, मूल'। ('$$' के साथ कुछ मेकफ़ाइल जादू है।) – kevinarpe

+0

प्रासंगिक शीर्षलेख, या 'chrpath' देखने के लिए' readelf -d' का उपयोग करें। – Richard

0

\ $ \ मूल अगर आप chrpath और \ $ \ $ मूल उपयोग कर रहे हैं आप LDFLAGS

में सीधे प्रदान कर रहे हैं
संबंधित मुद्दे