2014-10-02 5 views
7

हाल ही में मैं एक लोड करने योग्य मॉड्यूल बनाने और पाया गया कि दोनोंजीसीसी और एलडी द्वारा जोड़ने के बीच क्या अंतर है?

gcc -fPIC --shared -o foo.so.1 foo.c 

और

gcc -fPIC --shared -c foo.c 
ld --shared -o foo.so.2 foo.o 

ही प्रभाव प्राप्त कर सकते हैं किया गया था।

मैं यह भी पता चला है कि foo.so.1 3KB के बारे में द्वारा foo.so.2 से बड़ा है, और

gcc -### -fPIC --shared -o foo.so.1 foo.c 

पता चला है कि जीसीसी foo.so.1 में foo.c के अलावा अन्य सामान जोड़ा (जैसे, crtendS.o और crtn.o):

/usr/lib/gcc/x86_64-linux-gnu/4.7/collect2 "--sysroot=/" --build-id --no-add-needed --eh-frame-hdr -m elf_x86_64 "--hash-style=both" -shared -o foo.so.1 /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.7/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/4.7 -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.7/../../.. /tmp/cc3JBdCJ.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.7/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crtn.o 

दोनों foo.so.1 और foo.so.2 के बाद से dlopen के माध्यम से लोड किया जा सकता है, मैं सोच रहा था:

  1. अंतर क्या है के मध्य इन 2 लिंकिंग तरीकों में?
  2. क्या crtendS.o और crtn.o निर्मित पुस्तकालयों में कार्यों में कोई फर्क पड़ता है?

उत्तर

6

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

अतिरिक्त ऑब्जेक्ट फ़ाइलों के लिए ... वे शायद वैश्विक लोड-टाइम लाइब्रेरी प्रारंभिक/डी-प्रारंभिक कोड को संकलक द्वारा स्पष्ट रूप से जोड़ते हैं। (मानक पुस्तकालय द्वारा अनुरोध किया गया है?) आप यहां इसके बारे में कुछ जानकारी पा सकते हैं: https://gcc.gnu.org/onlinedocs/gccint/Initialization.html

+0

यदि "जीसीसी लिंकिंग" परिणाम प्रत्यक्ष एलडी कॉल से भिन्न होता है तो जीसीसी को अतिरिक्त तर्क (विकल्प, libs) को ld से गुजरकर प्राप्त करना होगा । –

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