web-dev-qa-db-ja.com

GNU CライブラリとC標準ライブラリの実際の違いは何ですか?

これら2つの用語が同じ意味で使用されていることがあります。

これら2つの用語の実際の違いは何ですか?それらはどのように異なって使用されますか?これら2つのライブラリに代わるものは他にありますか?

3
yoyo_fun

C標準ライブラリ はCプログラミング言語の一部であるため、specification(一部のテクニカルレポートでは英語で記述) )。たとえば、 n1570 ドキュメントは、mallocの概要とその動作を説明しています。

また、 C POSIXライブラリ (多かれ少なかれC標準ライブラリのスーパーセット)の関連仕様もあります。たとえば、dlopenforkはどちらもPOSIXで指定されています(C11標準では無視されます)。

GNU glibc ライブラリは、C標準ライブラリ(およびそのスーパーセット)とC POSIXライブラリの実装です。これは free software (ほとんどがCで書かれているGCC方言に少しのアセンブラーが含まれている) システムコールを使用しているsyscalls(2) にリストされている) kernel によって処理されます。C標準の他の実装を使用できます musl-libc (または dietlibc )のようなライブラリ。

アセンブラコードを書くことで、libcを回避し、カーネルに直接システムコールを行うことができます。これはめったに行われません( Bones Schemeコンパイラ、または BusyBox など)。ほとんどのプログラムはlibcを通じてシステムコールを実行し、そのlibcによって提供される関数を利用します。したがって、libcはLinuxシステムの基礎です...

ちなみに、GNU glibcには、 backtrace functions などの標準外の便利な関数や、 プログラムの引数 を解析します。

標準が要求するものと実際に何が起こるかの間には微妙な違いがあることに注意してください(たとえば、 memory overcommitmentmallocに非標準的な方法で影響します)、またはLinux dlopenには [〜#〜] posix [〜#〜] が必要とするよりも多くのフラグがあります)。

Linuxのmanページは、一般に、標準への準拠が関数であることを説明しています。 dlopen(3) で例を探してください。

libc(7) および vdso(7) も参照してください。

19

Cのすべての実装は標準ライブラリを提供する必要がありますが、すべてのCコンパイラがFSFによって作成されているわけではありません。したがって、GNU CコンパイラはGNU Cライブラリを使用し、IntelのCコンパイラは別の標準ライブラリを使用します(あまり目立たない名前)。両方ともC標準が必要とする標準ライブラリのインスタンス化。

1
Kilian Foth

「GNU」の代わりに「UNIX」を読んだ場合、用語は同じものだったので長い間交換可能でした。

BSDが開発されるまで、AT&TのUNIXライブラリは[〜#〜] the [〜#〜] Cライブラリでした-コンパイラが[〜#〜] the [〜#だったためです〜] Cコンパイラ(ほとんどの場合)。

BSDの後には、System V UNIX、BSD UNIX、GNU(GNU's Not Unix))があり、すぐにどこにでもCコンパイラがあり、それぞれに標準ライブラリの独自の実装がありました。

0