理由の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.so
Linuxシステムで提供されます。
それは正確ではありません。この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で動作するようにコンパイラを変更した場合...
/configure
GCCコンパイラーを再構築し、再構築する必要があります。また、GCCコンパイラーにパッチを適用する必要がある場合もあります(ABIおよび呼び出し規約を説明するため)。x32のABIは良い例です。
最後に、GCC(私を含む)への貢献者またはメンテナーの一部は、GCC をカバーするがGNUはカバーしない著作権の譲渡に署名しましたglibc
。
(GCCライセンスについては、GCCランタイムライブラリの例外を注意深くお読みください)
GCCのような、<limits.h>
または<stdint.h>
GCCによって提供されるいくつかの標準ヘッダーに注意してください。その他は、<stdlib.h>
GCCビルド中に「修正」されます。コンパイラビルドプロシージャはLibc実装からそれらを取得し、パッチを適用します。それでも、他の標準ヘッダー(おそらく<stdio.h>
、それに含まれる内部ヘッダー)はから取得されますlibc
。GCC FIXINCLUDESおよび固定ヘッダーファイルの詳細をご覧ください。
(fixincludesの事は私(Basile)がまだよく理解していないものです)
一緒gcc -v -H
にコンパイルして、どの実際のプログラムが実行されるか(gcc
ドライバー、cc1
コンパイラー、ld
&collect2
リンカー、as
アセンブラーなどを実行するため)、どのヘッダーが含まれるか、どのライブラリーおよびオブジェクトファイルがリンクされているか(さらには、 C標準ライブラリとcrt0を含む暗黙的に)。GCC オプションの詳細をご覧ください。
ところで、GCCが期待している、またはビルドされたC標準ライブラリ(musl-libc
または一部のdietlibcなど)とは異なるC標準ライブラリを使用できますgcc
。