कारणों में से एक यह है कि जीसीसी का निर्माण और उपयोग किया जा सकता है (उदाहरण के लिए मालिकाना यूनिक्स सिस्टम जैसे कि मैकओएसएक्स, सोलारिस, एचपीयूएक्स या कुछ फ्रीबीएसडी) जो कि अपने स्वयं के सी मानक पुस्तकालय हैं ।
लिनक्स पर भी, आपके पास C मानक पुस्तकालय हो सकता है जो GNU Glibc नहीं है । विशेष रूप से, आप जीसीसी का निर्माण कर सकते हैं (या इसका इस्तेमाल) के साथ Linux सिस्टम पर musl-libc या साथ बायोनिक (एंड्रॉयड सिस्टम) या साथ dietlibc , आदि और एक Linux सिस्टम जीएनयू Glibc हो सकता था और (जैसे कुछ अन्य सी संकलक उपयोग बजना या टाइनीसीसी)।
साथ ही, C लाइब्रेरी लिनक्स कर्नेल पर बहुत अधिक निर्भर करती है। कर्नेल के कुछ पुराने संस्करणों को कुछ विशेष प्रकार (या संस्करण) की आवश्यकता हो सकती हैlibc
और जीसीसी एक क्रॉस-कंपाइलर के रूप में निर्माण योग्य है ।
और " main
फ़ंक्शन कैसे कॉल करें" जैसे विवरण भी कंपाइलर पर निर्भर करते हैं, लेकिन वास्तव में, उन विवरणों को libc.so
लिनक्स सिस्टम द्वारा आपूर्ति की जाती है ।
यह बिल्कुल सही नहीं है। main
समारोह से पुकारा जाता है (एक की मेजबानी की स्थिति में) crt0 सामान, जिनमें से कुछ जीसीसी द्वारा प्रदान की जाती है (उदाहरण के लिए /usr/lib/gcc/x86_64-linux-gnu/6/crtbegin.o
पर मेरे Debian / सिड / x86-64 से है libgcc-6-dev
पैकेज)। इसके बारे में भी पढ़ेंlibgcc
दरअसल, libc
जीसीसी और जीसीसी के बीच कुछ आधे छिपे हुए संबंध हैं , क्योंकि कई libc
हेडर (वैकल्पिक रूप से) कुछ जीसीसी बिल्डिंस या फ़ंक्शन विशेषताओं का उपयोग करते हैं ।
(इसलिए GCC डेवलपर्स और GNU libc डेवलपर्स को बातचीत करनी होगी)
.... अगर मैं एक और ABI के साथ काम करने के लिए कंपाइलर बदलूं ...
आपको ... /configure
GCC कंपाइलर और इसे फिर से बनाना होगा, और आपको GCC कंपाइलर (अपने ABI और कॉलिंग कन्वेंशन का वर्णन करने के लिए) पैच करना पड़ सकता है । X32 ABI एक अच्छा उदाहरण है।
अंत में, GCC के कुछ योगदानकर्ताओं या अनुरक्षकों (मेरे सहित) ने एक कॉपीराइट असाइनमेंट पर हस्ताक्षर किए हैं जो GCC को कवर करता है लेकिन GNU को नहीं glibc
।
(जीसीसी लाइसेंस के बारे में, ध्यान से पढ़ें जीसीसी रनटाइम लाइब्रेरी अपवाद )
ध्यान दें कि कुछ मानक हेडर, जैसे कि <limits.h>
या <stdint.h>
जीसीसी द्वारा प्रदान किए गए हैं; अन्य, जैसे <stdlib.h>
GCC बिल्ड के दौरान "फिक्स्ड" हैं: कंपाइलर बिल्ड प्रक्रिया उन्हें Libc कार्यान्वयन से लेती है और उन्हें पैच करती है। फिर भी, अन्य मानक हेडर (शायद <stdio.h>
और आंतरिक हेडर इसमें शामिल हैं) से लिया गया है libc
। GCC FIXINCLUDES और फिक्स्ड हैडर फ़ाइलों के बारे में और पढ़ें ।
(फिक्की की बात कुछ ऐसी है जिसे मैं (बेसिल) अभी भी अच्छी तरह से नहीं समझता हूं)
आप gcc -v -H
अधिक सटीक रूप से समझने के लिए संकलित कर सकते हैं कि कौन से वास्तविक कार्यक्रम चलाए जा रहे हैं (चूंकि gcc
एक ड्राइवर है, cc1
कंपाइलर को चलाने वाला , ld
& collect2
लिंकर्स, as
असेंबलर, आदि ...) और कौन से हेडर शामिल हैं, कौन सी लाइब्रेरी और ऑब्जेक्ट फाइलें जुड़ी हुई हैं (यहां तक कि संक्षेप में , सी मानक पुस्तकालय और crt0 सहित )। GCC विकल्पों के बारे में और पढ़ें ।
BTW, आप एक C मानक लाइब्रेरी का उपयोग कर सकते हैं, जिसे आपके GCC के किसी एक एक्सपेक्टेशन से अलग किया गया हो musl-libc
या (जैसे या कुछ डाइटलिबक ) के लिए बनाया गया हो , उपयुक्त अतिरिक्त तर्कों को दरकिनार कर gcc
...