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
...
gcclibc
yang dibangun di atas pustaka OS, tetapi versi sebagai bagian dari GCC dan bukan OS.<stdint.h>
atau<limits.h>
memang disediakan oleh GCC. Header lainnya, seperti<stdlib.h>
yang diambil dari perpustakaan C dan "diperbaiki" selama pembuatan GCC.Jawaban singkatnya adalah jika keduanya 'dibundel' bersama-sama, glibc akan dilisensikan di bawah GPL *, dan karena itu akan sama sekali tidak cocok untuk proyek-proyek berpemilik. Sementara proyek FSF dan GNU tidak menyukai perangkat lunak berpemilik, glibc dilisensikan LGPL sebagai pilihan strategis untuk memajukan adopsi GCC dan ekosistem perangkat lunak bebas. GCC sebenarnya berlisensi di bawah GPL dengan pengecualian tautan runtime tertentu, karena situasinya agak berlumpur. glibc dilisensikan per LGPL untuk mengizinkan situasi shared-library yang masuk akal.
https://www.gnu.org/licenses/gcc-exception-faq.html
Selain itu, glibc memiliki semua jenis shims dan komponen lain untuk menyesuaikannya untuk berbagai sistem operasi, dan mendistribusikannya sebagai paket yang sama dengan gcc juga akan membuat keadaan berantakan.
* Atau, GCC dapat dilisensikan di bawah sesuatu GPL lain, meskipun pemikiran FSF tentang hal itu akan berada di sepanjang garis "atas mayat saya".
sumber