Neden glibc GCC'den ayrı tutulur?


13

GCC, C derleyicisidir. Glibc C kütüphanesidir. Ancak, bir derleyici ve C uygulaması olarak bir araya getirilmiş standart kütüphane için mutlak bir gereklilik değil mi?

Örneğin, Cı-kütüphanesi gibi ABI ve derleyici özel malzeme içeren <limits.h>, <stdint.h>vb derleyici ve API arasında olan farklıdır. Ve "bir ana fonksiyonun nasıl çağrılacağı" gibi detaylar da derleyiciye bağlıdır, ancak aslında bu detaylar libc.sobir Linux sisteminde sağlanır. Örneğin, derleyiciyi int8 bayt ile kullanmak gibi başka bir ABI ile çalışacak şekilde değiştirirsem, C kitaplığı artık çalışmaz, çünkü içerideki şeyler <limits.h>yanlış olur.

Yanıtlar:


20

Bunun nedenlerinden biri, GCC'nin kendi C standart kütüphanesine sahip (örneğin MacOSX, Solaris, HPUX veya bazı FreeBSD gibi tescilli Unix sistemleri) üzerine kurulabilmesi ve kullanılabilmesidir .

Linux'ta bile, GNU Glibc olmayan bir C standart kütüphanesine sahip olabilirsiniz . Özellikle, GCC inşa edebilirsiniz (veya kullanmak) ile Linux sistemlerinde musl-libc'nin veya Bionic (Android sistemleri) veya dietlibc GNU Glibc olabilir vs. Ve Linux sistemi ve benzeri (bazı diğer C derleyicisi kullanabilirsiniz Clang veya TinyCC).

Ayrıca, C kütüphanesi büyük ölçüde Linux çekirdeğine bağlıdır. Çekirdeğin bazı eski sürümleri, belirli bir tür (veya sürüm) gerektirebilir.libc

Ve GCC bir çapraz derleyici olarak üretilebilir .

Ve "bir mainfonksiyonun nasıl çağrılacağı" gibi detaylar da derleyiciye bağlıdır, ama aslında bu detaylar libc.sobir Linux sisteminde sağlanır.

Bu tam olarak doğru değil. Bu mainişlev (barındırılan bir ortamda) bazıları GCC tarafından sağlanan crt0 şeyler tarafından çağrılır (örn /usr/lib/gcc/x86_64-linux-gnu/6/crtbegin.o. Debian / Sid / x86-64 libgcc-6-devpaketinde bulunur). Hakkında da okuyunlibgcc

Aslında, libcve GCC arasında yarı gizli bir ilişki vardır, çünkü birçok libcüstbilgi (isteğe bağlı olarak) bazı gcc yerleşiklerini veya işlev niteliklerini kullanıyor .

(dolayısıyla GCC geliştiricileri ve GNU libc geliştiricilerinin etkileşimde bulunması gerekir)

.... derleyiciyi başka bir ABI ile çalışacak şekilde değiştirirsem ...

Sen hiç ... gerekecektir /configureGCC derleyicisi ve onu yeniden ve hatta gerekebilir yama (sizin ABİ ve açıklamak için GCC derleyicisi arama kuralları ). X32 ABI iyi bir örnektir.

Sonunda, GCC'ye katkıda bulunanlar veya sahipleri (ben dahil) , GNU'yu değil GCC'yi kapsayan bir telif hakkı ataması imzaladı glibc.

(GCC lisansıyla ilgili olarak, GCC çalışma zamanı kitaplığı istisnasını dikkatlice okuyun )

GCC gibi <limits.h>veya bu standart başlıkların <stdint.h>sağlandığına dikkat edin ; <stdlib.h>GCC derlemesi sırasında "sabit" olan diğerleri : derleyici derleme yordamı bunları Libc uygulamasından alır ve yamalar. Yine de, diğer standart başlıklar (muhtemelen <stdio.h>ve içerdiği iç başlıklar) libc. GCC FIXINCLUDES ve Sabit Başlık Dosyaları hakkında daha fazla bilgi edinin .

(fixincludes şey ben (Basile) hala iyi anlamadığım bir şey)

Sen ile derlemek olabilir gcc -v -H(çünkü gerçek programlar çalıştırmak hangi daha doğrusu anlamaya gccçalışan bir sürücü cc1derleyici, ldve collect2bağlayıcıları, ashatta (bağlantılıdır hangi kütüphaneler ve nesne dosyaları, ... vb montajcı,) ve bahsedilen başlıklar dahildir dolaylı olarak, C standart kütüphanesi ve crt0 dahil ). GCC seçenekleri hakkında daha fazla bilgi edinin .

BTW, GCC'nizin beklediği veya oluşturulduğu (örn. musl-libcVeya bazı dietlibc ) kitaplarından farklı bir C standart kitaplığı , uygun ekstra argümanları atlayarak gcc...


1
Doğru bir tasarım olmasa bile doğru cevap. Bu nedenle MSVC ++, 2011/2014 öncesi İşletim Sistemleri için C ++ 11 / C ++ 14 kodunu derleyebilir, ancak GCC genellikle yapamaz.
MSalters

"Doğru tasarım değil" ile ne demek istiyorsun? GCC'nin eski işletim sistemleri için C ++ 14 kodunu derleyemediğinden emin değilim (ancak, bu eski işletim sisteminde son GCC'yi derlemeniz gerekebilir).
Basile Starynkevitch

ISO C'ye göre, C Standart Kütüphanesi derleyicinin bir parçasıdır. Aynı şey C ++ kütüphanesi için de geçerlidir. Şimdi sorun, yeni bir GCC sürümüyle oluşturulan uygulamaların, oluşturuldukları işletim sisteminin glibc'sine bağımlı olması ve hedef sistemdeki glibc'den daha yeni olması. Daha iyi bir çözüm muhtemelen gcclibcişletim sistemi kitaplıklarına dayanan, ancak işletim sistemi değil, GCC'nin bir parçası olarak sürümlendirilen bir belgedir.
MSalters

C11 veya C ++ 14 standartlarının "derleyici" sözcüğünden bahsettiğinden emin misiniz? AFAIU onlar "uygulama" (yazılım bile olmayabilir) söz
Basile Starynkevitch

1
Bazı başlıklar, GCC gibi <stdint.h>veya <limits.h>gerçekten sağlanır. <stdlib.h>C başlığından alınan ve GCC oluşturma sırasında "düzeltilen" gibi diğer başlıklar .
Basile Starynkevitch

-5

Kısa cevap, eğer ikisi birlikte 'paketlenmiş' ise, glibc GPL * lisansı altında lisanslanacak ve bu nedenle tescilli projeler için tamamen uygun olmayacaktır. FSF ve GNU projesinin tescilli yazılımlara olan sevgisi olmasa da, glibc, LGPL'yi GCC'nin ve özgür yazılım ekosisteminin benimsenmesini ilerletmek için stratejik bir seçenek olarak lisansladı. GCC aslında GPL altında belirli bir çalışma zamanı bağlama istisnasıyla lisanslanmıştır, çünkü durum biraz çamurludur. glibc, mantıklı paylaşılan kütüphane durumlarına izin vermek için LGPL'ye göre lisanslanmıştır.

https://www.gnu.org/licenses/gcc-exception-faq.html

Ek olarak, glibc, farklı işletim sistemlerine uyarlamak için her türlü şime ve diğer bileşenlere sahiptir ve bunu gcc ile aynı paket olarak dağıtmak da işleri dağınık hale getirecektir.

* Alternatif olarak, GCC başka bir GPL altında lisanslanabilir, ancak FSF'nin bu konudaki düşünceleri "ölü bedenimin üzerinde" çizgisinde olacaktır.


3
Üzgünüm, ama bu cevap IMHO yanlış. "Birlikte bir araya gelme", ​​glibc'nin GPL'de açıklanan anlamda GCC'den bir "türetilmiş eser" artırma anlamına gelmez. Örneğin, farklı açık kaynak lisansları kullanan tonlarca yazılım paketi her Linux dağıtımında "bir araya getirilir", ancak yine de bu paketler GPL'yi ihlal etmez.
Doc Brown

Neden gcc ve glibc'yi bir araya getirmek glibc'yi GPL altında olmaya zorlasın ki? Anladığım kadarıyla, demetler bir "birleşik çalışma" değildi, bu nedenle GPL sınırı geçmedi. Düzenleme: Doc Brown ne dedi :-)
Philip Kendall
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.