दो GCC संकलित करें। एक तीसरी .o फ़ाइल में ऑब्जेक्ट फ़ाइलें


84

कोई दो GCC संकलित कैसे करता है। एक तीसरी .o फ़ाइल में ऑब्जेक्ट फ़ाइलें?

$ gcc -c  a.c -o a.o
$ gcc -c  b.c -o b.o
$ ??? a.o b.o -o c.o
$ gcc c.o other.o -o executable

यदि आपके पास स्रोत फ़ाइलों तक पहुंच है, तो -combineGCC ध्वज संकलन से पहले स्रोत फ़ाइलों को मर्ज कर देगा:

$ gcc -c -combine a.c b.c -o c.o

हालाँकि यह केवल स्रोत फ़ाइलों के लिए काम करता है, और GCC .oइस आदेश के लिए इनपुट के रूप में फ़ाइलों को स्वीकार नहीं करता है ।

आम तौर पर, .oफ़ाइलों को जोड़ना ठीक से काम नहीं करता है, क्योंकि आप इसके लिए इनपुट के रूप में लिंकर के आउटपुट का उपयोग नहीं कर सकते हैं। परिणाम एक साझा पुस्तकालय है और परिणामी निष्पादन योग्य में सांख्यिकीय रूप से जुड़ा नहीं है।

$ gcc -shared a.o b.o -o c.o
$ gcc c.o other.o -o executable
$ ./executable
./executable: error while loading shared libraries: c.o: cannot open shared object file: No such file or directory
$ file c.o
c.o: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped
$ file a.o
a.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

1
gcc के पास वर्तमान में कोई -combineविकल्प नहीं है। यह gcc 4.1.2 में मौजूद है और gcc 6.3.0 में मौजूद नहीं है (जब इसे हटाया गया था तब कोई और व्यक्ति इसका पता लगा सकता है)।
कीथ थॉम्पसन

जवाबों:


98

पासिंग -relocatableया -rकरने के लिए ldएक वस्तु के इनपुट के रूप में उपयुक्त है कि पैदा करेगा ld

$ ld -relocatable a.o b.o -o c.o
$ gcc c.o other.o -o executable
$ ./executable

उत्पन्न फ़ाइल मूल .oफ़ाइलों के समान है।

$ file a.o
a.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
$ file c.o
c.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

2
क्या उलटा ऑपरेशन करना संभव है? यानी एओ और बो सह से उत्पादन?
बर्ट रेगिंकल

7
@BertRegelink नहीं, क्योंकि कोई अनूठा विलोम नहीं है, गणित के संदर्भ में, समूह नहीं बनता है: P
एलेक टीले

7
चेतावनी: --relocatableकम पोर्टेबल लगती है। Android NDK के साथ आने वाला ld ही पहचानता है -relocatable। यदि आपको पोर्टेबिलिटी की आवश्यकता है, तो छड़ी करें -r
मार्टिन बोनर

3
@matthijs शब्द एक ही है; अंतर एक या दो शून्य है।
मार्टिन बोनर

1
आह, यह नहीं देखा। तो, एंड्रॉइड NDK केवल पहचानता है -relocatable और -r , लेकिन नहीं --relocatable। स्पष्टीकरण देने के लिए धन्यवाद!
मैथिज्स कोइजमैन

10

यदि आप दो या अधिक .o फ़ाइलों का संग्रह बनाना चाहते हैं (यानी एक स्टैटिक लाइब्रेरी) arकमांड का उपयोग करें :

ar rvs mylib.a file1.o file2.o

@ ल्यूसीयन लेकिन आप ऐसा क्यों करना चाहेंगे? एक स्थिर लाइब्रेरी एक .o फ़ाइल की तुलना में लिंक करने के लिए बहुत अधिक सुविधाजनक है।

5
मुझे objcopyपरिणामी फ़ाइल पर चलने और फ़ाइल में कुछ प्रकार के प्रतीक बनाने की आवश्यकता है ताकि वे बाहरी रूप से दिखाई न दें। स्थानीयकरण की आवश्यकता वाले कुछ प्रतीकों को फ़ाइलों a.oऔर b.oफ़ाइलों के बीच संदर्भित किया जाता है । मैं अलग-अलग फ़ाइलों को स्थानीय नहीं कर सकता - क्योंकि लिंक लिंकर समय पर प्रतीक नहीं मिलेंगे - और मैं या तो स्थिर संग्रह से प्रतीकों को स्थानीय नहीं कर सकता।
लुसियन एड्रियन ग्रिंजिनु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.