หนึ่งในเหตุผลก็คือว่าGCCสามารถสร้างและใช้กับ (เช่นระบบ Unix เป็นกรรมสิทธิ์เช่น MacOSX โซลาริส HPUX หรือ FreeBSD) ระบบของตัวเองที่มีมาตรฐานห้องสมุด C
แม้ในลินุกซ์, คุณสามารถมีไลบรารีมาตรฐาน C ซึ่งไม่ได้เป็นGNU Glibc โดยเฉพาะคุณสามารถสร้าง GCC (หรือใช้) บนระบบ Linux ด้วยmusl-libcหรือBionic (ระบบ Android) หรือกับdietlibcเป็นต้นและระบบ Linux อาจมี GNU Glibc และใช้คอมไพเลอร์ C อื่น ๆ (เช่นClangหรือ TinyCC)
นอกจากนี้ไลบรารี C ขึ้นอยู่กับเคอร์เนลของ Linux เป็นอย่างมาก เคอร์เนลเวอร์ชันเก่าบางรุ่นอาจต้องการชนิด (หรือรุ่น) บางอย่างlibc
และ GCC เป็น buildable เป็นcompiler ข้าม
และรายละเอียดเช่น "วิธีการเรียกใช้main
ฟังก์ชัน" ยังขึ้นอยู่กับคอมไพเลอร์ด้วย แต่ในความเป็นจริงรายละเอียดเหล่านั้นถูกจัดทำโดยlibc.so
ระบบ Linux
นั่นไม่ถูกต้องอย่างแน่นอน main
ฟังก์ชั่นที่เรียกว่า (ในสภาพแวดล้อมที่เป็นเจ้าภาพ) โดยcrt0สิ่งบางอย่างที่ให้บริการโดย GCC (เช่น/usr/lib/gcc/x86_64-linux-gnu/6/crtbegin.o
บนของ Debian / ซิด / x86-64 อยู่ห่างจากlibgcc-6-dev
แพคเกจ) อ่านเกี่ยวกับlibgcc
ที่จริงมีบางความสัมพันธ์ครึ่งซ่อนระหว่างlibc
และ GCC เช่นเพราะหลายlibc
ส่วนหัวมี (ขยะ) โดยใช้ gcc บางbuiltinsหรือแอตทริบิวต์ของฟังก์ชั่น
(ด้วยเหตุนี้นักพัฒนา GCC และนักพัฒนา GNU libc จะต้องโต้ตอบกัน)
.... ถ้าฉันเปลี่ยนคอมไพเลอร์ให้ทำงานกับ ABI อื่น ...
คุณจะต้อง ... /configure
คอมไพเลอร์ GCC และสร้างใหม่และคุณอาจต้องแก้ไขคอมไพเลอร์ GCC (เพื่ออธิบาย ABI ของคุณและการเรียกประชุม ) x32 ABIเป็นตัวอย่างที่ดี
ที่ล่าสุดร่วมสมทบบางส่วนหรือดูแลของ GCC (รวมทั้งผม) ได้ลงนามมอบหมายลิขสิทธิ์ซึ่งครอบคลุม GCC แต่ไม่ glibc
GNU
(เกี่ยวกับสิทธิ์ใช้งาน GCC โปรดอ่านข้อยกเว้นของไลบรารีรันไทม์ GCCอย่างระมัดระวัง)
โปรดสังเกตว่าส่วนหัวมาตรฐานบางอย่างเช่น<limits.h>
หรือ<stdint.h>
จัดหาโดย GCC อื่น ๆ เช่น<stdlib.h>
"คงที่" ในระหว่างการสร้าง GCC: ขั้นตอนการสร้างคอมไพเลอร์นำพวกเขาจากการใช้ Libc และแก้ไขพวกเขา ยังคงหัวมาตรฐานอื่น ๆ (อาจ<stdio.h>
และหัวต่อภายในมันจะรวมถึง) libc
ถูกนำมาจาก อ่านเพิ่มเติมเกี่ยวกับGCC FIXINCLUDESและส่วนหัวของแฟ้มคงที่
(สิ่งที่รวมอยู่คือสิ่งที่ฉัน (Basile) ยังไม่เข้าใจดี)
คุณสามารถรวบรวมgcc -v -H
เพื่อทำความเข้าใจได้อย่างแม่นยำมากขึ้นว่าโปรแกรมจริงใดที่ทำงานอยู่ (เนื่องจากgcc
เป็นไดร์เวอร์, รันcc1
คอมไพเลอร์, ld
& collect2
linkers, แอสas
เซมเบลอร์, ฯลฯ ... ) และส่วนหัวใดรวมอยู่ด้วย โดยนัยรวมถึงไลบรารีมาตรฐาน C และcrt0 ) อ่านเพิ่มเติมเกี่ยวกับ GCC ตัวเลือก
BTW คุณสามารถใช้ไลบรารีมาตรฐาน C ที่แตกต่างจาก GCC ที่คุณคาดหวังหรือสร้างขึ้นสำหรับ (เช่นmusl-libc
หรือdietlibcบางส่วน) โดยข้ามอาร์กิวเมนต์พิเศษที่เหมาะสมเพื่อgcc
...