web-dev-qa-db-ja.com

Linuxアプリでのlibc(glibc)の役割は何ですか?

gdbを使用してプログラムをデバッグすると、通常、libcglibc?)で定義された奇妙な名前の関数が表示されます。私の質問は:

  1. libc/glibcstrcpystrlenmallocなどの標準C/C++関数の標準実装
  2. または、上記の最初の使用法だけでなく、openclosefctlなどのUnix/Linuxシステム呼び出しのラッパーでもありますか?もしそうなら、なぜlibcなしで直接syscallを発行できないのですか?
  3. libcは1つのlib(.aまたは.so)ファイル、または多数のlibファイル(この場合、libcは、この一連のlibの一般名です)?これらのlibファイルはどこにありますか?
  4. libcglibcの違いは何ですか?
56

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だけでなく、前述のlibmlibpthreadなどの他のコアライブラリも提供します。したがって、libcはglibcが提供するライブラリの1つにすぎません。また、glibc以外のlibcの代替実装もあります。

58
caf

最初の2つに関して、glibcはC標準ライブラリ(「標準C関数」など)であり、システムコールのラッパーでもあります。コンパイラは方法を知らないため、システムコールを直接発行することはできません。glibcには、アセンブリで記述されたシステムコールを発行するために必要な「接着剤」が含まれています。 (これを自分で再実装することは可能ですが、それよりもはるかに面倒です。)

(C++標準ライブラリは別のものです。これはlibstdc++と呼ばれます。)

glibcは単一の.so(動的ライブラリ)ファイルではありません-たくさんありますが、libcとlibmは最も一般的に使用される2つです。静的および動的ライブラリはすべて/libに格納されています。

libcは、すべてのC標準ライブラリを指すために使用される一般的な用語です-いくつかあります。 glibcは最も一般的に使用されるものです。その他には、eglibc、uclibc、dietlibcなどがあります。

17
duskwuff

「標準ライブラリ」です。 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ソースコードへの参照を含む)に答えるべきです:

3
paulsm4

以下のようにコピーしたシェルで「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.
1
Turgay Kale