2010-05-18 8 views
81

जब मैं अपने उबंटू ल्यूसिड 10.04 पीसी पर कुछ संकलित करता हूं तो यह ग्लिब के खिलाफ जुड़ा हुआ है। ल्यूसिड 2.11 ग्लिब का उपयोग करता है। जब मैं एक पुरानी ग्लिब के साथ किसी अन्य पीसी पर इस बाइनरी को चलाता हूं, तो कमांड कहता है कि कोई ग्लिब 2.11 नहीं है ...मैं एक विशिष्ट glibc संस्करण से कैसे लिंक कर सकता हूं?

जहां तक ​​मुझे पता है कि ग्लिब प्रतीक प्रतीक का उपयोग करता है। क्या मैं एक विशिष्ट प्रतीक संस्करण के खिलाफ लिंक करने के लिए जीसीसी को मजबूर कर सकता हूं?

मेरे ठोस उपयोग में मैं एआरएम के लिए एक जीसीसी क्रॉस टूलचेन संकलित करने का प्रयास करता हूं।

+44

अरग यह वास्तव में उन परेशान लिनक्स समस्याओं में से एक है जहां समाधान हमेशा "आपको ऐसा नहीं करना चाहिए", जिसका अर्थ है "यह काम नहीं करता है और किसी ने इसे अभी तक ठीक नहीं किया है"। – Timmmm

+0

लोगों ने विंडोज़ पर डीएलएल नरक के बारे में शिकायत की। मुझे लिनक्स * कुछ * aficionados याद है जो इसे विंडोज़ दुनिया से एक विशेष रूप से भयानक उदाहरण के रूप में लाने की कोशिश कर रहा है। जब मैं पहली बार * यह * एक दशक पहले लिनक्स विकास कर रहा था, तो मैंने अपने हाथों में अपना चेहरा दफन कर दिया था। – 0xC0000022L

उत्तर

54

आप उस glibc में सही हैं प्रतीक संस्करण का उपयोग करता है। यदि आप उत्सुक हैं, तो glibc 2.1 में प्रस्तुत प्रतीक संस्करण कार्यान्वयन को here वर्णित किया गया है और here वर्णित सूर्य की प्रतीक संस्करण योजना का विस्तार है।

एक विकल्प आपकी बाइनरी को स्थिर रूप से लिंक करना है। यह शायद सबसे आसान विकल्प है।

तुम भी एक chroot निर्माण वातावरण में अपने द्विआधारी निर्माण, या एक glibc- नई => glibc- वर्ष पार संकलक का उपयोग कर सकता है।

http://www.trevorpounds.com ब्लॉग पोस्ट Linking to Older Versioned Symbols (glibc) के अनुसार, यह किसी भी प्रतीक के लिए मजबूर करने के लिए संभव है जब तक कि यह एक ही .symver छद्म सेशन कि संस्करणीकृत परिभाषित करने के लिए प्रयोग किया जाता है का उपयोग करके मान्य है एक पुराने एक के खिलाफ जुड़े होने की पहली जगह में प्रतीकों। निम्नलिखित उदाहरण blog post से उद्धृत किया गया है।

निम्नलिखित उदाहरण ग्लिब के रीयलपाथ का उपयोग करता है, लेकिन यह सुनिश्चित करता है कि यह पुराने 2.2.5 संस्करण के विरुद्ध जुड़ा हुआ है।

#include <limits.h> 
#include <stdlib.h> 
#include <stdio.h> 

__asm__(".symver realpath,[email protected]_2.2.5"); 
int main() 
{ 
    char* unresolved = "/lib64"; 
    char resolved[PATH_MAX+1]; 

    if(!realpath(unresolved, resolved)) 
     { return 1; } 

    printf("%s\n", resolved); 

    return 0; 
} 
+10

glibc स्थिर लिंकिंग का समर्थन नहीं करता है - स्थिर रूप से जुड़े ग्लिब प्रोग्राम विभिन्न libc संस्करणों के साथ सिस्टम पर काम नहीं करते हैं। –

+2

glibc का 'libc.a' मौजूद है, glibc * कुछ * मामलों में इसका समर्थन करता है, हालांकि यह [अनुशंसित नहीं है (Drepper)] (http://www.akkadia.org/drepper/no_static_linking.html)। आपको गैर-तुच्छ कार्यक्रमों में परेशानी होगी, एनएसएस का उपयोग करने वाली किसी भी चीज ([एफएक्यू] में कामकाज] (https://sourceware.org/glibc/wiki/FAQ))। –

15

स्थैतिक के साथ लिंक। जब आप -static से लिंक करते हैं तो लिंकर निष्पादन योग्य के अंदर लाइब्रेरी को एम्बेड करता है, इसलिए निष्पादन योग्य बड़ा होगा, लेकिन इसे ग्लिब के पुराने संस्करण वाले सिस्टम पर निष्पादित किया जा सकता है क्योंकि प्रोग्राम इसकी अपनी लाइब्रेरी का उपयोग करेगा प्रणाली।

+47

अक्सर ऐसा करने का कारण आप ऐसा करना चाहते हैं क्योंकि आप एक बंद-स्रोत एप्लिकेशन वितरित कर रहे हैं। इस मामले में अक्सर लाइसेंसिंग कारणों के लिए स्थैतिक रूप से लिंक करने की अनुमति नहीं है (ऐसा करने के लिए आपको अपना सभी स्रोत कोड जारी करना होगा) ताकि आपको -स्टैटिक से सावधान रहना पड़े। – Malvineous

+1

इस बीच कम से कम एक अक्सर musl-libc का सहारा ले सकता है, लेकिन सी ++ प्रोग्राम के साथ चीजें अधिक जटिल हो सकती हैं, इसलिए एक प्रतीक संस्करण निर्दिष्ट करना अभी भी आवश्यक हो सकता है। – 0xC0000022L

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