5

これが問題です。

ほとんどの人は、最初に C 言語に触れると同時に C 標準ライブラリについて学びますが、私も例外ではありませんでした。しかし、現在 Linux を勉強しているので、C ライブラリと混同しがちです。まず、gcc を Linux ディストリビューションに静的ライブラリとしてインストールすると、古い C 標準ライブラリが手に入ります。その後、インターネットに接続するとすぐに新しい安定版の glibc を入手できます。

私はglibc APIを調べ始めましたが、ここでめちゃくちゃになりました。glibc は、基本的に POSIX C 標準 lib (標準 C lib (私が知っているように C99 を含む) を実装する) から始まり、POSIX 標準 C lib に基づく独自の拡張機能まで、膨大な量の lib をサポートしているようです。

これは、glibc が実際に POSIX C 標準ライブラリの関数を変更または追加したということですか? または、まったく新しいヘッダーセットを追加しますか? 標準 C ライブラリには含まれていないが、実際には標準 C ヘッダーに含まれているいくつかの関数が表示されます (たとえば、

また、「まったく新しいヘッダー セットを作成する glibc」について言及したのは、linux/blahblah.h や sys/syscalls.h <= (これらはglibc のみがサポートするライブラリ?)

次の質問は、Linux は C 言語をベースに構築されていると実際に聞いたことです。これは、Linux が独自の gcc コンパイラでコンパイルされるということですか???????

4

3 に答える 3

5

最初の質問については、glibc は標準 C と POSIX の両方に準拠しています

GNU C ライブラリは、主にポータブルで高性能な C ライブラリとして設計されています。ISO C11 および POSIX.1-2008 を含むすべての関連規格に準拠しています。また、国際化されており、知られている最も完全な国際化インターフェイスの 1 つを備えています。

2 番目の質問については、はい、gcc を使用して Linux をコンパイルできます。gcc 自体も gcc を使用してコンパイルできますが、これはbootstrappingと呼ばれます。

于 2013-07-28T09:44:46.900 に答える
2

glibc は POSIX、ANSI、および ISO C 標準を実装し、「glibc 拡張機能」と呼ばれる独自の「綿毛」を追加します。それらがすべて「混合」されている理由は、ライブラリを 1 つのパッケージとして作成したためであり、POSIX 専用の個別の glibc はありません。

<linux/blah>glibc の一部ではありません。これは、プログラマーが Linux カーネル API にアクセスできるようにするために、glibc の外部の人々によってオペレーティング システム用に特別に作成された一連のヘッダーです。これは Linux カーネルの「一部」であり、Linux カーネルとともにインストールされ、カーネル ハッキングに使用されます。<sys/blah>glibc の一部であり、Linux に固有です。かなり抽象化された Linux システム API へのアクセスを提供します。

2 番目の質問については、はい。Linux は (Linus によると) カーネルお​​よびシステム プログラミング用の唯一のプログラミング言語であるため、C で記述されています。これは、ブートストラップと呼ばれる手法を使用して行われます。この手法では、小さなコンパイラが (通常は ASM で手動で) 構築され、カーネル全体または GCC 全体が構築されます。

于 2013-07-28T13:48:13.207 に答える
1

注意すべきことがもう 1 つあります。libc の目的の 1 つは、実際のシステム カーネルから抽象化することです。そのため、libc はカーネル固有のアプリの一部です。syscall が異なる別のカーネルを使用している場合は、特別にコンパイルされた libc が必要になります。私の知る限り、libcは通常共有ライブラリとしてリンクされています。

Linux システムは通常、Linux カーネルの上に GNU ツールチェーンを備えた GNU/Linux システムであるため、通常、Linux では glibc がインストールされています。

そして、はい、glibc は特定の場所で標準を拡張しasprintf()ます。たとえば、関数は gnu 追加として作成されました。その後、ほぼ C11 標準に組み込まれましたが、標準の一部になるまでは、glibc ベースのシステム、または glibc と静的にリンクする必要があります。

デフォルトでは、glibc ヘッダーはこれらの gnu 追加を定義しません。GNU_SOURCE適切なヘッダーを含める前にプリプロセッサ マクロを定義するか-std=gnu11、gcc 呼び出しに指定することで、それらをオンにすることができます。

于 2013-07-28T13:47:45.347 に答える