हाल ही में मैं एक लोड करने योग्य मॉड्यूल बनाने और पाया गया कि दोनोंजीसीसी और एलडी द्वारा जोड़ने के बीच क्या अंतर है?
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 के माध्यम से लोड किया जा सकता है, मैं सोच रहा था:
- अंतर क्या है के मध्य इन 2 लिंकिंग तरीकों में?
- क्या crtendS.o और crtn.o निर्मित पुस्तकालयों में कार्यों में कोई फर्क पड़ता है?
यदि "जीसीसी लिंकिंग" परिणाम प्रत्यक्ष एलडी कॉल से भिन्न होता है तो जीसीसी को अतिरिक्त तर्क (विकल्प, libs) को ld से गुजरकर प्राप्त करना होगा । –