gdb
を使用してプログラムをデバッグすると、通常、libc
(glibc
?)で定義された奇妙な名前の関数が表示されます。私の質問は:
libc/glibc
strcpy
、strlen
、malloc
などの標準C/C++関数の標準実装open
、close
、fctl
などのUnix/Linuxシステム呼び出しのラッパーでもありますか?もしそうなら、なぜlibc
なしで直接syscallを発行できないのですか?libc
は1つのlib(.a
または.so
)ファイル、または多数のlibファイル(この場合、libc
は、この一連のlibの一般名です)?これらのlibファイルはどこにありますか?libc
とglibc
の違いは何ですか?libc
は、strcpy()
のような標準C関数とgetpid()
のようなPOSIX関数(システムコールの場合もあります)の両方を実装します。すべての標準C関数がlibc
にあるわけではないことに注意してください。ほとんどの数学関数はlibm
にあります。
カーネルへの呼び出しは通常の関数呼び出しではないため、リンカで解決できないため、通常の関数を呼び出すのと同じ方法で直接システムコールを行うことはできません。代わりに、アーキテクチャ固有のアセンブリ言語サンクがカーネルの呼び出しに使用されます。もちろん、これらを独自のプログラムで直接記述することもできますが、libc
がそれらを提供するため、必要はありません。
Linuxでは、POSIX APIを提供するのはカーネルとlibc
の組み合わせであることに注意してください。 libc
は適切な量の値を追加します。必ずしもすべてのPOSIX関数がシステムコールであるとは限りません。また、そうした関数については、カーネルの動作が必ずしもPOSIXに準拠しているとは限りません。
libc
は単一のライブラリファイルです(両方の.so
および.a
バージョンが利用可能です)、ほとんどの場合/usr/lib
。ただし、glibc(GNU libc)プロジェクトはlibc
だけでなく、前述のlibm
やlibpthread
などの他のコアライブラリも提供します。したがって、libc
はglibcが提供するライブラリの1つにすぎません。また、glibc以外のlibc
の代替実装もあります。
最初の2つに関して、glibcはC標準ライブラリ(「標準C関数」など)であり、システムコールのラッパーでもあります。コンパイラは方法を知らないため、システムコールを直接発行することはできません。glibcには、アセンブリで記述されたシステムコールを発行するために必要な「接着剤」が含まれています。 (これを自分で再実装することは可能ですが、それよりもはるかに面倒です。)
(C++標準ライブラリは別のものです。これはlibstdc++
と呼ばれます。)
glibcは単一の.so
(動的ライブラリ)ファイルではありません-たくさんありますが、libcとlibmは最も一般的に使用される2つです。静的および動的ライブラリはすべて/lib
に格納されています。
libcは、すべてのC標準ライブラリを指すために使用される一般的な用語です-いくつかあります。 glibcは最も一般的に使用されるものです。その他には、eglibc、uclibc、dietlibcなどがあります。
「標準ライブラリ」です。 Windowsの世界では「MSVCRTL」とまったく同じです。
Gnu標準ライブラリ( "glibc")は、Linuxシステムで見られる最も一般的な(ほぼ普遍的な?)libcの実装です。古いSusE Linuxシステムの関連ファイルは次のとおりです。
ls -l /lib =>
-rwxr-xr-x 1 root root 1383527 2005-06-14 08:36 libc.so.6
ls -l /usr/lib =>
-rw-r--r-- 1 root root 2580354 2005-06-14 08:20 libc.a
-rw-r--r-- 1 root root 204 2005-06-14 08:20 libc.so
このリンクは、あなたが持つかもしれない追加の質問(完全かつ完全なGLibcソースコードへの参照を含む)に答えるべきです:
以下のようにコピーしたシェルで「man libc」と入力すると、Linuxシステムのmanページから「libc」と「glibc」に関する詳細情報を確認できます。
LIBC(7) Linux Programmer's Manual LIBC(7)
NAME
libc - overview of standard C libraries on Linux
DESCRIPTION
The term "libc" is commonly used as a shorthand for the "standard C library", a library of standard functions that can be
used by all C programs (and sometimes by programs in other languages). Because of some history (see below), use of the
term "libc" to refer to the standard C library is somewhat ambiguous on Linux.
glibc
By far the most widely used C library on Linux is the GNU C Library ⟨http://www.gnu.org/software/libc/⟩, often referred
to as glibc. This is the C library that is nowadays used in all major Linux distributions. It is also the C library
whose details are documented in the relevant pages of the man-pages project (primarily in Section 3 of the manual). Doc‐
umentation of glibc is also available in the glibc manual, available via the command info libc. Release 1.0 of glibc was
made in September 1992. (There were earlier 0.x releases.) The next major release of glibc was 2.0, at the beginning of
1997.
The pathname /lib/libc.so.6 (or something similar) is normally a symbolic link that points to the location of the glibc
library, and executing this pathname will cause glibc to display various information about the version installed on your
system.
Linux libc
In the early to mid 1990s, there was for a while Linux libc, a fork of glibc 1.x created by Linux developers who felt
that glibc development at the time was not sufficing for the needs of Linux. Often, this library was referred to
(ambiguously) as just "libc". Linux libc released major versions 2, 3, 4, and 5 (as well as many minor versions of those
releases). For a while, Linux libc was the standard C library in many Linux distributions.
However, notwithstanding the original motivations of the Linux libc effort, by the time glibc 2.0 was released (in 1997),
it was clearly superior to Linux libc, and all major Linux distributions that had been using Linux libc soon switched
back to glibc. Since this switch occurred long ago, man-pages no longer takes care to document Linux libc details. Nev‐
ertheless, the history is visible in vestiges of information about Linux libc that remain in some manual pages, in par‐
ticular, references to libc4 and libc5.