2012-02-22 13 views
6

मैं निम्नलिखित rpath साथ openssl 1.0.0g संकलित करने के लिए कोशिश कर रहे हैं के साथ openssl संकलित करने के लिए कैसे:रिश्तेदार rpath

$ORIGIN/../lib64 

हर मैं readelf -d apps/openssl, मैं क्या एस्केपिंग भिन्नता मैंने कोशिश की पर निर्भर करता है निम्न रूप में परिणाम हो रही है :

\RIGIN/../lib64 
RIGIN/../lib64 
ORIGIN/../lib64 

मैं अपने आरपीएथ को chrpath जैसे बाहरी उपकरणों का उपयोग किए बिना सेटअप करना चाहता हूं। क्या यह सब संभव है? मैं मूल रूप से कुछ भी है कि chrpath जैसे बाहरी उपकरण का उपयोग कर (हालांकि मैं पहले से ही है कि के साथ किया जाएगा) को शामिल नहीं करता स्वीकार करेंगे।

आदर्श रूप में, मैं कमांड लाइन (-Wl,-rpath,$ORIGIN/../lib64 के किसी भी रूप) पर विकल्प पारित करके यह करने के लिए करना चाहते हैं।

मैं संपादन उत्पन्न Makefile, जो है मैं क्या पिछले कोशिश कर रहे हैं कोई आपत्ति नहीं है। अगर मैं केवल एक बेवकूफ डॉलर के निशान मुद्रित करने के लिए मिल सकता है !!! मैं BUILDENV = कोई भाग्य के साथ ब्लॉक के तहत संशोधित LIBRPATH की कोशिश की। मेरे सबसे अच्छे परिणाम अब तक:

LIBRPATH=$$'ORIGIN/../lib64 # result: /../lib64 
LIBRPATH=$$$$'ORIGIN/../lib64 # result: 12345<pid>/../lib64 

मैं विभिन्न rpath संबंधित प्रश्नों पढ़ सकते हैं और से बचने और चालें के हवाले से विभिन्न कोशिश की, लेकिन कुछ भी नहीं अब तक काम किया है!

उत्तर

7

अपने makefile कोशिश में:

-Wl,-rpath,${ORIGIN}/../lib64 

मैं यह सोचते हैं कि मूल एक खोल चर रहा है।

संपादित

मैं सिर्फ अपने प्रश्न (बेहतर देर से तो कभी नहीं) का उत्तर मिल गया है: आप डबल interpolating चर से बनाने के लिए, यह है कि आप उपयोग करने की आवश्यकता करने के लिए $$ (को रोकने के लिए की जरूरत है dolar चिह्न):

-Wl,-rpath,'$$ORIGIN/../lib64' 

मुझे पता है कि यह काम करता है क्योंकि मैं इसे अपने खुद के आवेदन के साथ परीक्षण किया है, का आनंद लें :)

+0

यह नहीं है और यह पूरे मुद्दे का हिस्सा है। निष्पादन योग्य में लिखे जाने के लिए मुझे कूड़े की स्ट्रिंग '$ ORIGIN /../ lib64' की आवश्यकता है। किसी भी तरह का कोई प्रतिस्थापन नहीं होना चाहिए। –

+0

क्या आप कृपया स्पष्ट कर सकते हैं कि आप किस ओपनस्ल का उपयोग कर रहे थे और मेकफ़ाइल की कौन सी रेखा बदल गई है? –

+0

ओपनएसएसएल में 'Makefile.org' और रिकर्सिव मेकफ़ाइल का एक गुच्छा है। और वे 'CFLAGS', 'LDFLAGS', आदि का सम्मान नहीं करते हैं, इसलिए *" आपके मेकफ़ाइल प्रयास करें ... "* * जैसा * लगता है उतना आसान नहीं है। – jww

2

मैं चला गया chrpath रास्ता। http://enchildfone.wordpress.com/2010/03/23/a-description-of-rpath-origin-ld_library_path-and-portable-linux-binaries/

ओपनएसएल में '$$ ओरिजिन' के खोल विस्तार का मुकाबला करना काफी जटिल है। जल्द या बाद में, यह डॉलर के संकेत के कारण विस्तारित हो जाता है। यदि आप वास्तव में इस तरह से जाना चाहते हैं, तो आप इसे कर सकते हैं। मैं निम्नलिखित लिनक्स पर openssl 1.0.1g के साथ काम करने मिल गया है। Makefile.shared में, इस लाइन को देखें:

DO_GNU_APP=LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBRPATH)" 

इसे निम्न के साथ बदलें। इस हवाले से फू $ के विस्तार को बेअसर। डबल $$ मेकफ़ाइल में एक डॉलर का संकेत प्राप्त करने का तरीका है।

DO_GNU_APP=LDFLAGS="$(CFLAGS) -Wl,-rpath,'"'$$'"ORIGIN/../lib64'" 

संकलन के बाद:

readelf -d apps/openssl | grep RPATH 
0x000000000000000f (RPATH)    Library rpath: ['$ORIGIN/../lib64'] 
+0

'DO_GNU_APP = LDFLAGS ...' - मुझे लगता है * यह 'libssl.so' को अभी भी गलत 'libcrypto.so' लोड करने की अनुमति देगा। – jww

+0

*** प्लस वन *** ... आप * एक शैल चर के साथ एक सापेक्ष RPATH * प्राप्त करने में कामयाब रहे। क्या 'ldd' शैल चर का सम्मान करता है? क्या यह विस्तार करता है? मैं इस सवाल को बुकमार्क करने जा रहा हूं क्योंकि मैंने इसे पहले कभी नहीं देखा है .... – jww

+0

$ ओरिजिन एक विशेष विषम टोकन है। यदि आप मुझसे पूछते हैं तो एक बुरी तरह चुने गए व्यक्ति, क्योंकि डॉलर का संकेत एक विशेष चरित्र है जो गोले द्वारा विस्तारित नहीं होता है, अगर मेकफ़ाइल द्वारा नहीं किया जाता है। यही कारण है कि निष्पादन योग्य में $ ORIGIN को छूना इतना जटिल है। यह chrpath का उपयोग करने के लिए saner है। इस तरह के रिश्तेदार rpath आपके openssl स्थान को स्वतंत्र बनाता है और आपको विभिन्न स्थानों में एकाधिक संस्करणों को बनाए रखने की अनुमति देता है। –

0

मैं संपादन उत्पन्न Makefile, जो है मैं क्या पिछले कोशिश कर रहे हैं कोई आपत्ति नहीं है ...

मुझे यकीन नहीं है कि आप इसे खोल चर और सापेक्ष पथ से सेट कर सकते हैं। I ldd$ORIGIN$ORIGIN/../lib64 में $ORIGIN फैलाता है। इस मामले में, मुझे लगता है कि आपको ldconfig से लाइब्रेरी खोज पथ में$ORIGIN/../lib64 जोड़ने की आवश्यकता है। अधिक जानकारी के लिए सर्वर फॉल्ट पर finding ldd search path देखें।

चूंकि मुझे यकीन नहीं है, मैं वैसे भी निर्देश प्रदान करूंगा। आपको मेकफ़ाइल को बदलने की आवश्यकता नहीं है। वास्तव में, मेरे पास अतीत में ऐसा कोई भाग्य नहीं था क्योंकि चीजें ओवरराइट हो जाती हैं, और CFLAGS और LDFLAGS जैसी अन्य चीजों को अनदेखा कर दिया जाता है।

यह भी देखें Build OpenSSL with RPATH? आपका प्रश्न और उद्धृत प्रश्न अलग-अलग प्रश्न हैं जो समान उत्तरों (उनके बीच कोई डुप्लीकेट नहीं) पर अभिसरण करते हैं। लेकिन यह RPATHs पर ओपनएसएसएल देव की स्थिति प्रदान करता है। यह एक निजी ईमेल था, इसलिए मैंने पूरे संदेश की बजाय प्रासंगिक विवरण साझा किए।

यदि आप ईएलएफ अनुभाग में $ORIGIN/../lib64 एम्बेड करना प्रबंधित करते हैं और यह काम करता है, तो कृपया वापस रिपोर्ट करें। नीचे, मैं अपने RPATH के लिए /usr/local/ssl/lib का उपयोग कर रहा हूं। /usr/local/ssl/lib के लिए आपको $ORIGIN/../lib64 को प्रतिस्थापित करना चाहिए।


OpenSSL बीएसडी लक्ष्य (लेकिन अन्य) के लिए बॉक्स से बाहर RPATH के समर्थन करता है। कॉन्फ़िगर से: होने के लिए

# Unlike other OSes (like Solaris, Linux, Tru64, IRIX) BSD run-time 
# linkers (tested OpenBSD, NetBSD and FreeBSD) "demand" RPATH set on 
# .so objects. Apparently application RPATH is not global and does 
# not apply to .so linked with other .so. Problem manifests itself 
# when libssl.so fails to load libcrypto.so. One can argue that we 
# should engrave this into Makefile.shared rules or into BSD-* config 
# lines above. Meanwhile let's try to be cautious and pass -rpath to 
# linker only when --prefix is not /usr. 
if ($target =~ /^BSD\-/) 
    { 
    $shared_ldflag.=" -Wl,-rpath,\$(LIBRPATH)" if ($prefix !~ m|^/usr[/]*$|); 
    } 

OpenSSL 1.0.2 के लिए यह करने के लिए सबसे आसान तरीका है प्रकट होता हैadd it to linker flags during configuration

./config -Wl,-rpath=/usr/local/ssl/lib 

तुम भी कॉन्फ़िगर लाइन और हार्ड कोड rpath संपादित कर सकते हैं। उदाहरण के लिए, मैं डेबियन x86_64 पर काम कर रहा हूं। तो मैं एक संपादक में फ़ाइल Configure, linux-x86_64 की नकल की है, यह linux-x86_64-rpath नामित खोला, और -rpath विकल्प जोड़ने के लिए निम्न परिवर्तन किया:

"linux-x86_64-rpath", "gcc:-m64 -DL_ENDIAN -O3 -Wall -Wl,-rpath=/usr/local/ssl/lib:: 
-D_REENTRANT::-Wl,-rpath=/usr/local/ssl/lib -ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL: 
${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64", 

ऊपर, खेतों 2 और 6 बदल रहे थे। वे ओपनएसएसएल के निर्माण प्रणाली में $cflag और $ldflag से मेल खाते हैं।

फिर, कॉन्फ़िगर नए विन्यास:

$ ./Configure linux-x86_64-rpath shared no-ssl2 no-ssl3 no-comp \ 
    --openssldir=/usr/local/ssl enable-ec_nistp_64_gcc_128 

अंत में, make के बाद, सत्यापित करें सेटिंग्स अटक:

$ readelf -d ./libssl.so | grep -i rpath 
0x000000000000000f (RPATH)    Library rpath: [/usr/local/ssl/lib] 
$ readelf -d ./libcrypto.so | grep -i rpath 
0x000000000000000f (RPATH)    Library rpath: [/usr/local/ssl/lib] 
$ readelf -d ./apps/openssl | grep -i rpath 
0x000000000000000f (RPATH)    Library rpath: [/usr/local/ssl/lib] 

परिणाम की उम्मीद एक बार जब आप make install करते हैं, तो ldd का उत्पादन करेगा :

$ ldd /usr/local/ssl/lib/libssl.so 
    linux-vdso.so.1 => (0x00007ffceff6c000) 
    libcrypto.so.1.0.0 => /usr/local/ssl/lib/libcrypto.so.1.0.0 (0x00007ff5eff96000) 
    ... 

$ ldd /usr/local/ssl/bin/openssl 
    linux-vdso.so.1 => (0x00007ffc30d3a000) 
    libssl.so.1.0.0 => /usr/local/ssl/lib/libssl.so.1.0.0 (0x00007f9e8372e000) 
    libcrypto.so.1.0.0 => /usr/local/ssl/lib/libcrypto.so.1.0.0 (0x00007f9e832c0000) 
    ... 
संबंधित मुद्दे