Salah satu alasannya adalah bahwa GCC dapat dibangun dan digunakan pada (misalnya sistem Unix berpemilik seperti MacOSX, Solaris, HPUX atau beberapa FreeBSD) yang memiliki pustaka standar C sendiri .
Bahkan di Linux, Anda dapat memiliki pustaka standar C yang bukan GNU Glibc . Secara khusus, Anda dapat membangun GCC (atau menggunakannya) pada sistem Linux dengan musl-libc atau dengan Bionic (sistem Android) atau dengan dietlibc , dll. Dan sistem Linux dapat memiliki GNU Glibc dan menggunakan beberapa kompiler C lainnya (seperti Clang) atau TinyCC).
Juga, pustaka C sangat tergantung pada kernel Linux. Beberapa versi lama dari kernel mungkin memerlukan beberapa jenis (atau versi) tertentulibc
Dan GCC dapat dibangun sebagai cross-compiler .
Dan detail seperti "cara memanggil main
fungsi" juga tergantung pada kompiler, tetapi pada kenyataannya, detail tersebut disediakan oleh libc.so
pada sistem Linux.
Itu tidak sepenuhnya benar. The main
fungsi disebut (dalam lingkungan host) oleh crt0 hal, beberapa di antaranya disediakan oleh GCC (misalnya /usr/lib/gcc/x86_64-linux-gnu/6/crtbegin.o
pada saya Debian / Sid / x86-64 adalah dari libgcc-6-dev
paket). Baca juga tentanglibgcc
Sebenarnya, ada beberapa hubungan setengah tersembunyi antara libc
dan GCC, misalnya karena banyak libc
header (opsional) menggunakan beberapa gcc builtin atau atribut fungsi .
(karenanya pengembang GCC dan pengembang libc GNU harus berinteraksi)
.... jika saya mengubah kompiler untuk bekerja dengan ABI lain ...
Anda harus ... /configure
kompiler GCC dan membangunnya kembali, dan Anda bahkan mungkin perlu menambal kompiler GCC (untuk menggambarkan ABI dan konvensi pemanggilan ). The x32 ABI adalah contoh yang baik.
Akhirnya, beberapa kontributor atau pengelola GCC (termasuk saya) telah menandatangani penugasan hak cipta yang mencakup GCC tetapi bukan GNU glibc
.
(mengenai lisensi GCC, baca dengan hati - hati pengecualian perpustakaan runtime GCC )
Perhatikan bahwa beberapa tajuk standar, seperti <limits.h>
atau <stdint.h>
disediakan oleh GCC; yang lain, seperti <stdlib.h>
"diperbaiki" selama GCC build: prosedur build compiler mengambilnya dari implementasi Libc dan menambalnya. Namun, tajuk standar lainnya (mungkin <stdio.h>
dan tajuk internal yang disertakan) diambil dari libc
. Baca lebih lanjut tentang GCC FIXINCLUDES dan Fixed Header Files .
(Hal fixincludes adalah sesuatu yang saya (Basile) masih tidak mengerti dengan baik)
Anda dapat mengkompilasi dengan gcc -v -H
untuk memahami lebih tepat program mana yang sebenarnya dijalankan (karena gcc
merupakan driver, menjalankan cc1
compiler, tautan ld
& collect2
, as
assembler, dll ...) dan header mana yang disertakan, perpustakaan dan file objek mana yang ditautkan (bahkan secara implisit, termasuk pustaka standar C dan CRT0 ). Baca lebih lanjut tentang opsi GCC .
BTW, Anda dapat menggunakan pustaka standar C yang berbeda dengan yang diharapkan atau dibuat oleh GCC Anda (misalnya, musl-libc
atau beberapa dietlibc ), mem -bypass argumen tambahan yang sesuai ke gcc
...