2009-05-01 15 views
36

में स्थिर और गतिशील रूप से जुड़े पुस्तकालयों दोनों का उपयोग करें, मुझे एक बाइनरी वितरित करने की आवश्यकता है जो जितना संभव हो उतने x86 लिनक्स वितरण पर चलेंगे। इसका मतलब है कि मुझे ग्लिबिक जैसे कुछ पुस्तकालयों को स्थिर रूप से लिंक करना होगा, क्योंकि उपयोगकर्ता के पास संस्करण का उपयोग नहीं हो सकता है। अन्य पुस्तकालयों को गतिशील रूप से लिंक किया जाना चाहिए, जैसे फ़ॉन्ट कॉन्फिग, क्योंकि यह कैश फ़ाइल प्रारूप और हार्ड कोड वाले स्थानों पर निर्भर करता है जो प्रत्येक सिस्टम पर भिन्न हो सकते हैं।जीसीसी

ऐसा करने के लिए कमांड लाइन विकल्प क्या हैं? यदि मैं -स्टैटिक निर्दिष्ट करता हूं, तो जीसीसी किसी भी पुस्तकालयों को गतिशील रूप से लिंक करने से इनकार कर देगा।

उत्तर

68

आधुनिक यूनिक्स या लिनक्स सिस्टम पर किसी भी सिस्टम लाइब्रेरी के खिलाफ विशेष रूप से libc के खिलाफ लिंकिंग, बाइनरी को कम पोर्टेबल बनाता है। बस यह मत करो।

इसके बजाय, पिछली संगतता (पुराने सिस्टम पर जुड़ी बाइनरी सभी नए लोगों पर चलने वाली द्विआधारी) का उपयोग अपने लाभ के लिए करें, या तो पुरानी प्रणाली पर अपनी बाइनरी को जोड़कर (मैं रेडहाट 6.2 का उपयोग करता हूं, और मैंने लिनक्स नहीं देखा है सिस्टम जहां मेरी बाइनरी पिछले 8 वर्षों में नहीं चलेगी), या autopackage जैसे कुछ का उपयोग करके।

gcc main.o -Wl,-Bstatic -lfoo -Wl,-Bdynamic 

लिंकर libfoo का संग्रह संस्करण का उपयोग करने के कारण होगा:

अपने मूल प्रश्न का उत्तर देने। [पीछे -Wl,-Bdynamic पीछे होना महत्वपूर्ण है ताकि आप स्थैतिक libc को मजबूर नहीं कर सकें।]

+6

पहली बार मैंने उस पिछली गतिशील, चीयर्स के लिए स्पष्टीकरण देखा है –

2

लिंकर कमांड लाइन (वे .a या .so पुस्तकालयों) और ड्रॉप-स्टेटिक पर लिंक करने वाली लाइब्रेरी फ़ाइलों के पथों में गुजरने का प्रयास करें। यह ट्रिक काम आना चाहिए।

+0

जब कोई 'स्टेटिक' नहीं होता है तो एलडी का '-l:' विकल्प भी होता है, जिसका उपयोग कुछ पुस्तकालय को पूर्ण नाम से जोड़ने के लिए किया जा सकता है, बिना एलडी के इसे 'lib + name + .so'' तक बढ़ाया जा सकता है: ' -l: libsome_library.a' (https://sourceware.org/binutils/docs-2.18/ld/Options.html - '-lnamespec'" अगर नेमस्पेक फॉर्म का है: फ़ाइल नाम, ld लाइब्रेरी पथ को खोजेगा फाइलनाम नामक फ़ाइल, अन्यथा यह libnamespec.a नामक फ़ाइल के लिए लाइब्रेरी पथ खोजेगी। ") – osgx

3

यह ध्यान दिया जाना चाहिए कि, लिनक्स के तहत, आप केवल (सुरक्षित रूप से) लाइब्रेरी को लिंक कर सकते हैं यदि गतिशील पुस्तकालयों में से कोई भी निर्भर नहीं है इस पर। इसका अर्थ यह है कि यदि आप किसी भी गतिशील पुस्तकालयों का उपयोग कर रहे हैं, तो आप स्थिर रूप से libc को जोड़ने के बारे में भूल सकते हैं। Libc के मामले के खिलाफ निर्माण के लिए बस एक पुराने पुराने संस्करण का उपयोग करें; libc ने पिछले कुछ वर्षों में मजबूत एबीआई पीछे-संगतता बनाए रखी है।