glibcがGCCとは別に維持されるのはなぜですか?


13

GCCはCコンパイラです。GlibcはCライブラリです。しかし、コンパイラーとC実装として一緒にバンドルされた標準ライブラリーは絶対に必要ではないでしょうか?

例えば、CライブラリのようなABIおよびコンパイラの特定のものが含まれ<limits.h><stdint.h>、、などをどのコンパイラとAPIの間で異なります。また、「メイン関数を呼び出す方法」などの詳細もコンパイラに依存しますが、実際にはそれらの詳細はlibc.soLinuxシステムで提供されます。たとえば、int8バイトを使用するなど、別のABIで動作するようにコンパイラを変更すると、Cライブラリは機能しなくなり<limits.h>ます。

回答:


20

理由の1つは、GCCが独自のC標準ライブラリを持つシステム(MacOSX、Solaris、HPUX、またはいくつかのFreeBSDなどのプロプライエタリUnixシステム)で構築および使用できることです。

Linuxでも、GNU GlibcではないC標準ライブラリを使用できます。特に、musl-libcまたはBionic(Androidシステム)またはdietlibcなどを使用して、LinuxシステムでGCCを構築(または使用)できます。また、LinuxシステムはGNU Glibcを持ち、他のCコンパイラ(Clangなど)を使用できますまたはTinyCC)。

また、CライブラリはLinuxカーネルに大きく依存しています。一部の古いバージョンのカーネルでは、特定の種類(またはバージョン)のlibc

また、GCCはクロスコンパイラとしてビルドできます。

また、「main関数の呼び出し方法」などの詳細もコンパイラに依存しますが、実際には、これらの詳細はlibc.soLinuxシステムで提供されます。

それは正確ではありません。このmain関数はcrt0によって(ホストされた環境で)呼び出されます。その一部はGCCによって提供されます(たとえば/usr/lib/gcc/x86_64-linux-gnu/6/crtbegin.o、私のDebian / Sid / x86-64はlibgcc-6-devパッケージに含まれています)。についても読むlibgcc

実際、libc多くのlibcヘッダーが(オプションで)一部のgcc 組み込み関数または関数属性を使用しているため、とGCCの間にいくつかの隠れた関係があります

(したがって、GCC開発者とGNU libc開発者は対話する必要があります)

....別のABIで動作するようにコンパイラを変更した場合...

/configureGCCコンパイラーを再構築し、再構築する必要があります。また、GCCコンパイラーにパッチを適用する必要がある場合もあります(ABIおよび呼び出し規約を説明するため)。x32のABIは良い例です。

最後に、GCC(私を含む)への貢献者またはメンテナーの一部は、GCC をカバーするがGNUはカバーしない著作権の譲渡に署名しましたglibc

(GCCライセンスについては、GCCランタイムライブラリの例外を注意深くお読みください)

GCCのような、<limits.h>または<stdint.h>GCCによって提供されるいくつかの標準ヘッダーに注意してください。その他は、<stdlib.h>GCCビルド中に「修正」されます。コンパイラビルドプロシージャはLibc実装からそれらを取得し、パッチを適用します。それでも、他の標準ヘッダー(おそらく<stdio.h>、それに含まれる内部ヘッダー)はから取得されますlibcGCC FIXINCLUDESおよび固定ヘッダーファイルの詳細をご覧ください。

(fixincludesの事は私(Basile)がまだよく理解していないものです)

一緒gcc -v -Hにコンパイルして、どの実際のプログラムが実行されるか(gccドライバー、cc1コンパイラー、ldcollect2リンカー、asアセンブラーなどを実行するため)、どのヘッダーが含まれるか、どのライブラリーおよびオブジェクトファイルがリンクされているか(さらには、 C標準ライブラリとcrt0を含む暗黙的に)。GCC オプションの詳細をご覧ください。

ところで、GCCが期待している、またはビルドされたC標準ライブラリ(musl-libcまたは一部のdietlibcなど)とは異なるC標準ライブラリを使用できますgcc


1
正しい設計でなくても、正しい答え。これが、MSVC ++が2011/2014年以前のオペレーティングシステム用にC ++ 11 / C ++ 14コードをコンパイルできるのに、GCCが通常できない理由です。
–MSalters

「正しい設計ではない」とはどういう意味ですか?また、GCCが古いOS用のC ++ 14コードをコンパイルできないことはわかりません(ただし、その古いOSで最近のGCCをコンパイルする必要があるかもしれません)。
バジルスタリンケビッチ

ISO Cによると、C標準ライブラリはコンパイラの一部です。同じことがC ++ライブラリにも当てはまります。現在、問題は、新しいGCCバージョンでビルドされたアプリケーションは、ビルド先のOSのglibcに依存することです。これは、ターゲットシステムのglibcよりも新しい場合があります。より良い解決策は、おそらくgcclibcOSライブラリに基づいているが、OSではなくGCCの一部としてバージョン管理されているに依存しているでしょう。
-MSalters

C11またはC ++ 14標準で「コンパイラ」という言葉が言及されているのは確かですか?AFAIU、彼らは「実装」(ソフトウェアではないかもしれない)について話す
バジル・スタリンケビッチ

1
GCCのような、<stdint.h>または<limits.h>実際に提供されるヘッダーもあります。<stdlib.h>Cライブラリから取得され、GCCビルド中に「修正」されるなど、その他のヘッダー。
バジルスタリンケビッチ

-5

簡単な答えは、2つが一緒に「バンドル」されている場合、glibcはGPL *に基づいてライセンスされるため、プロプライエタリプロジェクトにはまったく不適切です。FSFとGNUプロジェクトはプロプライエタリなソフトウェアを愛していませんが、glibcはLGPLのライセンスを受けており、GCCとフリーソフトウェアエコシステムの採用を促進する戦略的選択肢として認められています。GCCは実際にはGPLの下でライセンスされており、特定のランタイムリンク例外があります。これは、状況がやや濁っているからです。glibcはLGPLに従ってライセンスされており、適切な共有ライブラリの状況を可能にします。

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

さらに、glibcには、さまざまなオペレーティングシステムに適応するためのすべての種類のシムやその他のコンポーネントがあり、gccと同じパッケージとして配布するのも面倒です。

*別の方法として、GCCは他のGPLの下でライセンスされますが、FSFの考えは「私の死体を越えて」の線に沿っているでしょう。


3
申し訳ありませんが、この答えは間違っています。「一緒に束ねる」ということは、GPLに記述されている意味で、GCCから「派生した作品」を取得することをglibcが意味するものではありません。たとえば、さまざまなオープンソースライセンスを使用する多数のソフトウェアパッケージが各Linuxディストリビューションに「バンドル」されていますが、これらのパッケージはGPLに違反していません。
ドックブラウン

なぜgccとglibcを一緒にバンドルすると、glibcがGPLの下に強制されるのですか?私の理解では、バンドルは「結合された作業」ではないため、GPLは境界を越えません。編集:Doc Brownが言ったこと:
フィリップケンドール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.