2010-11-22 7 views
13

जिस तरह से मेरी टीम की परियोजना विकसित की गई है, हम अपने सभी .o ऑब्जेक्ट फ़ाइलों से हमारे आवेदन के लिए साझा ऑब्जेक्ट लाइब्रेरी उत्पन्न करते हैं। मेरा काम (उम्मीद है कि यह पर्याप्त विशिष्ट है लेकिन दूसरों के लिए उपयोग करने के लिए भी सामान्य है!) केवल ऑब्जेक्ट फाइलों में लिंक करना है जो निष्पादन योग्य बनाया गया था। उदाहरण के लिए, यहां कमांड लाइन है जिसका उपयोग मैं .so:लिनक्स पर जीसीसी का उपयोग करके वृद्धिशील लिंकिंग। क्या यह संभव है?

g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o libMySharedLibrary.so 

जो अपेक्षा के अनुसार काम करता है! :) मेरा लक्ष्य समवर्ती लिंकिंग प्रक्रिया को तेज करने के लिए, अब से केवल बदली गई ऑब्जेक्ट फ़ाइलों में लिंक करने में सक्षम होना है। एक उदाहरण कमांड यह होगी:

g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o libMySharedLibrary.so 

कौन सा नया वस्तु फाइलों के साथ libMySharedLibrary.so अद्यतन होता है, जबकि यह भी libMySharedLibrary.so में बड़े वस्तु फ़ाइलों को बनाए रखने। वास्तविकता में, जब मैं उपरोक्त आदेश का उपयोग करके libMySharedLibrary.so उत्पन्न करता हूं, तो फ़ाइल-आकार उस ऑब्जेक्ट की तुलना में बहुत छोटा होता है जब सभी ऑब्जेक्ट फ़ाइलों को शामिल किया जाता है, इसलिए मैं लगभग सुनिश्चित कर सकता हूं कि उपरोक्त आदेश वह नहीं कर रहा है जो मैं चाहता हूं।

मेरे शोध के माध्यम से मैंने पाया है कि -i विकल्प है जो -r विकल्प जैसा है, जो कि सभी ऑब्जेक्ट फ़ाइलों को एक बड़ी ऑब्जेक्ट फ़ाइल में भी जोड़ता है। दुर्भाग्यवश ऐसा नहीं लगता है कि यह वही है जो मैं चाहता हूं।

संक्षेप में, मैं प्रारंभिक लिंक के बाद केवल बदली गई ऑब्जेक्ट फ़ाइलों में लिंक करना चाहता हूं, जिसके परिणामस्वरूप भविष्य के लिंक के लिए त्वरित लिंकिंग प्रक्रिया होती है। क्या इसे करने का कोई तरीका है?

संपादित करें: क्या मैं -i/-r साथ की कोशिश की है का एक उदाहरण:

उदाहरण आदेश: g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o AllMyObjects.o

मैं इसे की आवश्यकता होगी, के बारे में मुझ पर चिल्ला से रोकने के लिए -nostdlib टैग को जोड़ने के लिए किया था, और हटा दिया -shared क्योंकि -r टैग के साथ साझा वस्तुओं की अनुमति नहीं है।

यह आदेश मेरी सभी .o फ़ाइलों को एक बड़ी .o फ़ाइल में स्लैम करने के लिए प्रतीत होता है। तो अगर मैं सिर्फ उस .o फाइल को केवल बदली गई .o फाइलों के साथ अपडेट कर सकता हूं, तो यह बहुत अच्छा होगा। AllMyObjects.o प्रारंभ में बनाया गया था, मैंने इस कमांड को आजमाया: g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o AllMyObjects.o, लेकिन यह बहुत छोटा (फ़ाइल-आकार-वार) AllMyObjects.o भी बनाएगा, इसलिए मुझे लगता है कि यह संभवतः सभी ऑब्जेक्ट फ़ाइलों को नहीं रख सकता है। मुझे ऐसा लगता है कि यह ऐसा कुछ है जिस पर मैं एक छोटी सी गलती कर रहा हूं। किसी के पास कोई सलाह है? अग्रिम में धन्यवाद।

+0

क्या लिंक चरण वास्तव में आपके वृद्धिशील बिल्डों पर हावी है? यदि नहीं, तो परेशान क्यों? – dmckee

+0

क्या आप हमें दिखा सकते हैं कि आपने '-i'/'-r' के साथ क्या प्रयास किया है? ऐसा लगता है कि यह * वह विकल्प है जिसे आप चाहते हैं, हालांकि मुझे उम्मीद है कि आप प्रतीक संघर्ष में भाग लेंगे (क्योंकि वहां कोई 'प्रतिस्थापन' विकल्प नहीं है)। –

+0

लिंक चरण मेरे निर्माण का सबसे अधिक समय लेने वाला हिस्सा नहीं है। हालांकि, यह वह कार्य है जिसे मेरी टीम के नेता ने मुझे दिया है। जो कुछ बदल गया है उसे संकलित करने पर हम पहले से ही अच्छे हैं। वर्तमान में, हम केवल तभी संकलित करते हैं, जो हर बार ऑब्जेक्ट फ़ाइल को रिलिकिंक करते समय बदल जाता है। –

उत्तर

6

ऐसा लगता है कि आप -shared और -r के साथ काम नहीं कर रहे हैं। मैं अपने पुराने जीसीसी संस्करण के बारे में उलझन में था, लेकिन फिर भी उबंटू 10.10 पर मैं एक ही देख सकते हैं:

$ ld -shared -r 
/usr/bin/ld.bfd.real: -r and -shared may not be used together 

दुर्भाग्य से, इसका मतलब है कि आप एक अंत में मृत्यु यदि आप पूरी तरह से साझा वस्तुओं की जरूरत है पहुँच गए हैं। Binutils लिंकर बस इसे लागू नहीं करता है।

यदि स्थिर पुस्तकालय आपके लिए एक विकल्प हैं, तो वे केवल अभिलेखागार हैं जिन्हें ar उपयोगिता के साथ आसानी से छेड़छाड़ की जा सकती है।

अन्यथा, आपको अलग-अलग लिंकर्स या कंपाइलर सूट देखना होगा। मैं गारंटी नहीं दे सकता कि आपको यह सुविधा मिल जाएगी, हालांकि, यह विदेशी लगता है।

+0

ठीक है। आपके त्वरित प्रतिक्रियाओं के लिए बहुत बहुत धन्यवाद। मैं निश्चित रूप से अपने टीम के नेता से बात करूंगा और देख सकता हूं कि स्थिर पुस्तकालयों का उपयोग करना एक विकल्प होगा। मेरे शोध में, मैंने "गोल्ड" नामक एक वैकल्पिक लिंकर की खोज की जिसे Google पर इयान लांस टेलर द्वारा विकसित किया गया था। इसे मार्च 2008 में बिनुटिल्स में जोड़ा गया था। मैं इसे भी देख सकता हूं। मैं उम्मीद कर रहा था कि डिफ़ॉल्ट लिंकर का उपयोग करके ऐसा करने का कोई तरीका होगा, लेकिन ऐसा नहीं लगता है कि यह मामला है। एक बार फिर सहायताके लिए शुक्रिया! –

+3

मुझे लगता है कि 'सोना' स्थापित है, लेकिन 'सोना-शेर-आर' एक ही परिणाम देता है। –

+0

हाहा निश्चित रूप से यह मामला होगा। :) आपकी सहायता के लिए एक बार फिर से धन्यवाद। –

3

आप संग्रह/स्थैतिक पुस्तकालयों का उपयोग करने के बाद अपने व्यवहार को प्राप्त कर सकते हैं, लेकिन प्रारंभिक लिंक अभी भी उतना ही समय लेगा।

एक संग्रह फ़ाइल का उपयोग करना:

# Initially create the archive 
ar r libmylib.a <all object files> 

# Create your shared object (re-use this line after libmylib.a is updated) 
g++ -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' libmylib.a -o libmylib.so  

# Update the archive file 
ar r libmylib.a updated1.o updated2.o 

जैसा कि मैंने कहा, यह अभी भी उतना ही समय वास्तव में .so लिंक करने के लिए के रूप में यह पहले किया था ले जाएगा।

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