Mengapa glibc dikelola secara terpisah dari GCC?

13

GCC adalah kompiler C. Glibc adalah pustaka C. Namun, bukankah itu merupakan keharusan mutlak untuk sebuah kompiler dan perpustakaan standar yang digabungkan bersama sebagai implementasi C?

Sebagai contoh, C perpustakaan berisi ABI dan compiler tertentu hal-hal seperti <limits.h>, <stdint.h>, dll, yang berbeda antara compiler dan API. Dan detail seperti "bagaimana memanggil fungsi utama" juga tergantung pada kompiler, tetapi sebenarnya detail tersebut dipasok oleh libc.sopada sistem Linux. Misalnya, jika saya mengubah kompiler untuk bekerja dengan ABI lain, seperti menggunakan intdengan 8 byte, pustaka C tidak akan berfungsi lagi karena hal-hal di <limits.h>akan menjadi salah.

Michael Tsang
sumber

Jawaban:

20

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 mainfungsi" juga tergantung pada kompiler, tetapi pada kenyataannya, detail tersebut disediakan oleh libc.sopada sistem Linux.

Itu tidak sepenuhnya benar. The mainfungsi disebut (dalam lingkungan host) oleh crt0 hal, beberapa di antaranya disediakan oleh GCC (misalnya /usr/lib/gcc/x86_64-linux-gnu/6/crtbegin.opada saya Debian / Sid / x86-64 adalah dari libgcc-6-devpaket). Baca juga tentanglibgcc

Sebenarnya, ada beberapa hubungan setengah tersembunyi antara libcdan GCC, misalnya karena banyak libcheader (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 ... /configurekompiler 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 -Huntuk memahami lebih tepat program mana yang sebenarnya dijalankan (karena gccmerupakan driver, menjalankan cc1compiler, tautan ld& collect2, asassembler, 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-libcatau beberapa dietlibc ), mem -bypass argumen tambahan yang sesuai ke gcc...

Basile Starynkevitch
sumber
1
Jawaban yang benar, meskipun bukan desain yang benar. Inilah sebabnya mengapa MSVC ++ dapat mengkompilasi kode C ++ 11 / C ++ 14 untuk Sistem Operasi pra-2011/2014, tetapi GCC biasanya tidak bisa.
MSalters
Apa yang Anda maksud dengan "bukan desain yang benar"? Dan saya tidak yakin bahwa GCC tidak dapat mengkompilasi kode C ++ 14 untuk OS lama (namun, Anda mungkin perlu mengkompilasi GCC baru pada OS yang lebih lama).
Basile Starynkevitch
Menurut ISO C, Perpustakaan Standar C adalah bagian dari kompiler. Hal yang sama berlaku untuk pustaka C ++. Sekarang masalahnya adalah bahwa aplikasi yang dibangun dengan versi GCC baru akan memiliki ketergantungan pada glibc dari OS tempat mereka dibangun, yang mungkin lebih baru daripada glibc pada sistem target. Solusi yang lebih baik mungkin akan mengandalkan gcclibcyang dibangun di atas pustaka OS, tetapi versi sebagai bagian dari GCC dan bukan OS.
MSalters
Apakah Anda yakin bahwa standar C11 atau C ++ 14 menyebutkan kata "compiler"? AFAIU mereka berbicara tentang "implementasi" (yang bahkan mungkin bukan perangkat lunak)
Basile Starynkevitch
1
Beberapa tajuk, suka <stdint.h>atau <limits.h>memang disediakan oleh GCC. Header lainnya, seperti <stdlib.h>yang diambil dari perpustakaan C dan "diperbaiki" selama pembuatan GCC.
Basile Starynkevitch
-5

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".

Apa namanya
sumber
3
Maaf, tapi jawaban ini salah IMHO. "Bundling bersama" tidak menyiratkan glibc menjadi "karya turunan" dari GCC dalam arti yang dijelaskan dalam GPL. Sebagai contoh, berton-ton paket perangkat lunak yang menggunakan berbagai lisensi open source "dibundel bersama" di setiap distro Linux, namun paket-paket ini tidak melanggar GPL.
Doc Brown
Mengapa bundling gcc dan glibc bersama-sama memaksa glibc berada di bawah GPL? Pemahaman saya adalah bahwa bundel bukanlah "pekerjaan gabungan", sehingga GPL tidak melewati batas. Sunting: apa yang dikatakan Doc Brown :-)
Philip Kendall