2011-05-28 18 views
6

मुझे एक आवश्यकता है कि मैं libstdC++, libc, pthread आदि सहित स्थिर रूप से अपने सभी पुस्तकालयों को लिंक करता हूं। एक omniorb लाइब्रेरी है जिसे मैं गतिशील रूप से लिंक करना चाहता हूं।g ++ का उपयोग कर कुछ को छोड़कर सभी पुस्तकालयों को स्थिर रूप से कैसे लिंक करें?

वर्तमान में मैंने गतिशील रूप से सभी पुस्तकालयों को जोड़ा है। ldd निम्नलिखित

linux-vdso.so.1 => (0x00007fff251ff000) 
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f291cc47000) 
libomniDynamic4.so.1 (0x00007f291c842000) 
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f291c536000) 
libm.so.6 => /lib64/libm.so.6 (0x00007f291c2e0000) 
libgomp.so.1 => /usr/lib64/libgomp.so.1 (0x00007f291c0d7000) 
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f291bebf000) 
libc.so.6 => /lib64/libc.so.6 (0x00007f291bb66000) 
/lib64/ld-linux-x86-64.so.2 (0x00007f291ce63000) 
librt.so.1 => /lib64/librt.so.1 (0x00007f291b95d000) 
libomniORB4.so.1 (0x00007f291b6aa000) 
libomnithread.so.3 (0x00007f291cf35000 

मैं ldd जरूरत है केवल गतिशील रूप से जुड़े हुए पुस्तकालय के रूप में libomniDynamic4.so.1 दिखाने को दर्शाता है।

मैं इसे कैसे प्राप्त करूं?

उत्तर

-4

लिंकिंग करते समय, उन पुस्तकालयों को निर्दिष्ट करने से पहले -स्टैटिक का उपयोग करें जिन्हें आप स्थिर रूप से लिंक करना चाहते हैं, और उन पुस्तकालयों से पहले गतिशील करें जिन्हें आप गतिशील रूप से लिंक करना चाहते हैं। आप एक कमांड लाइन इस तरह लग रही के साथ खत्म करना चाहिए:

g++ <other options here> -dynamic -lomniDynamic4 -static -lpthread -lm -lgomp <etc> 
बेशक

, आप पुस्तकालयों आप स्थिर (डुह) लिंक करना चाहते हैं की ए संस्करणों की आवश्यकता होगी।

+6

यह उत्तर * पूरी तरह से गलत है: -स्टैटिक बंद हो जाता है - गतिशील और इसके विपरीत। आखिरी जीतता है। –

10

लिनक्स निष्पादन योग्य बनाने की कोशिश कर रहा है जो सभी distros पर चलता है? शुभकामनाएं ... लेकिन मैं digress ...

आप g12+ के लिए -v ध्वज आउटपुट देखना चाहते हैं। यह g ++/ld द्वारा निष्पादित आंतरिक लिंक आदेश दिखाता है। विशेष रूप से, आप अंतिम लिंक कमांड collect2 और इसके सभी तर्कों का निरीक्षण करना चाहेंगे। फिर आप उन एए लिबियों के सटीक पथ निर्दिष्ट कर सकते हैं जिन्हें आप लिंक करना चाहते हैं। आपको सब कुछ के स्थिर libs को भी ट्रैक करना होगा। मेरा libstdC++। /usr/lib/gcc/x86_64-linux-gnu/4.4/libstdc++.a

रेंट पर है: लिनक्स के बारे में मेरी सबसे बड़ी शिकायत निष्पादन योग्य की फ्रैक्चर स्थिति है। मैं एक मशीन पर बाइनरी क्यों संकलित नहीं कर सकता और इसे दूसरे पर कॉपी कर सकता हूं और इसे चला सकता हूं !? यहां तक ​​कि उबंटू distros एक रिलीज के अलावा कि libc की वजह से अन्य पर नहीं चलाया जा सकता बाइनरी फ़ाइलें उत्पादन करेगा/libstdC++ ABI incompatibilites

संपादित करें # 1 मैं बस जब प्रयास कर जोड़ने के लिए है कि The script on this page produces a .png of an executables .so dependencies. यह बहुत उपयोगी है चाहता था जो आप वर्णन करते हैं उसे करने के लिए।

जागरूक रहें ldd <exename> निष्पादन योग्य की तत्काल निर्भरता न केवल श्रृंखला के नीचे सभी निर्भरताओं को सूचीबद्ध करेगा। तो यहां तक ​​कि यदि आपका निष्पादन योग्य केवल omniorb.so पर निर्भर करता है, लेकिन omniorb.so पर निर्भर करता है, libphread.so, ldd का आउटपुट उस सूची में सूचीबद्ध होगा। बाइनरी की तत्काल निर्भरताओं को खोजने के लिए readelf के मैनपेज को देखें।

एक अन्य आइटम जो इसके बारे में पता होना चाहिए। अगर omniorb.so libstdC++ पर निर्भर करता है। तो, आपके पास उसी lib पर निर्भर होने के अलावा कोई विकल्प नहीं होगा। अन्यथा एबीआई असंगतताएं आपके कोड और omniorb के कोड के बीच आरटीटीआई तोड़ देंगे।

+1

निराशाजनक रूप से मेरे पास किसी के पद पर टिप्पणी करने के लिए पर्याप्त प्रतिनिधि नहीं है। लेकिन मैं @EmployedRussian से पूछना चाहता हूं कि यह विश्वास क्यों है कि "अधिकतर स्थिर" बाइनरी अधिक पोर्टेबल नहीं हैं। विपरीत सच क्यों है? मैं उन बाइनरी का उत्पादन करने में सक्षम हूं जो "अधिकतर स्थिर" मार्ग के बिना जो कुछ भी चलाने में सक्षम नहीं थे .... –

+1

अब आपके पास हर जगह टिप्पणी करने के लिए आवश्यक प्रतिनिधि है। कृपया अपनी नई अधिग्रहण शक्ति का उपयोग बुद्धिमानी से करें। – sbi

6

मुझे केवल गतिशील रूप से जुड़ी लाइब्रेरी के रूप में libomniDynamic4.so.1 दिखाने के लिए ldd की आवश्यकता है।

असंभव है।

पहले, ldd होगा हमेशा दिखाने के किसी भी (x86_64) बाइनरी कि गतिशील जोड़ने की आवश्यकता है के लिए ld-linux-x86-64.so.2।यदि आप गतिशील लिंकिंग का उपयोग करते हैं (जो आप libomniDynamic4.so.1 के साथ करेंगे), तो आप ld-linux-x86-64.so.2 प्राप्त करेंगे।

दूसरा, linux-vdso.so.1 कर्नेल द्वारा आपकी प्रक्रिया में "इंजेक्शन" है। आप से भी छुटकारा पा सकते हैं।

अगला, प्रश्न क्यों आप गतिशील पुस्तकालयों के उपयोग को कम करना चाहते हैं। सबसे आम कारण आमतौर पर गलत धारणा है कि "अधिकतर स्थिर" बाइनरी अधिक पोर्टेबल हैं, और अधिक सिस्टम पर चलेंगे। लिनक्स पर यह सच के विपरीत है।

यदि वास्तव में आप एक पोर्टेबल बाइनरी प्राप्त करने की कोशिश कर रहे हैं, तो कई विधियां मौजूद हैं। अब तक का सबसे अच्छा (मेरे अनुभव में) apgcc का उपयोग करना है।

+3

क्या आप अपनी टिप्पणी पर विस्तार से बता सकते हैं "* सबसे आम कारण आमतौर पर गलत धारणा है कि" अधिकतर स्थिर "बाइनरी अधिक पोर्टेबल नहीं हैं, और अधिक सिस्टम पर चलेंगे। लिनक्स पर यह सच के विपरीत है।" * मेरे पास है उन बाइनरी का उत्पादन करने में सक्षम था जो "अधिकतर स्थिर" मार्ग के बिना अन्य मशीनों पर जो कुछ भी चलाने में सक्षम नहीं थे ... –

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

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