libc(glibc)在我们的linux应用程序中的作用是什么?

当我们使用gdbdebugging一个程序时,我们通常会看到在libc(glibc?)中定义的具有奇怪名字的函数。 我的问题是:

  1. libc / glibc是“strcpy”,“strlen”,“malloc”等标准C / C ++函数的标准实现吗?
  2. 或者,它不仅是上述的第一个用法,而且是“open”,“close”,“fctl”之类的Unix / Linux系统调用的封装? 如果是这样,为什么我们不能直接发出系统调用,没有libc?
  3. libc只包含一个lib(.a或.so)文件,还是多个lib文件(在这种情况下,libc是这个lib的一般名称)? 这些lib文件在哪里?
  4. libc和glibc有什么不同?

libcgetpid()一样同时执行标准C函数,如strcpy()和POSIX函数(可能是系统调用getpid() 。 请注意,并非所有的标准C函数都在libc – 大部分数学函数都在libm

您不能像调用普通函数那样直接进行系统调用,因为调用内核不是正常的函数调用,所以它们不能被链接器解析。 而是使用体系结构特定的汇编语言thunk来调用内核 – 当然,您也可以直接在自己的程序中编写这些语句,但是您不需要,因为libc为您提供了这些语言。

请注意,在Linux中,它是提供POSIX API的内核和libc的组合。 libc增加了一个体面的价值 – 并不是每个POSIX函数都是一个系统调用,对于那些内核行为并不总是符合POSIX。

libc是一个单独的库文件( .so.a版本都可用),大多数情况下驻留在/usr/lib 。 然而,glibc(GNU libc)项目提供的不仅仅是libc ,它还提供了前面提到的libm ,以及libpthread等其他核心库。 所以libc只是glibc提供的库之一 – 除了glibc以外,还有libc其他替代实现。

关于前两个,glibc既是C标准库(例如“标准C函数”),也是系统调用的包装器。 您不能直接发出系统调用,因为编译器不知道如何 – glibc包含发出系统调用所需的“胶水”,这是用汇编写的。 (你自己可以重新实现,但是比它的价值要麻烦得多。)

(C ++标准库是一个独立的东西,叫做libstdc++ 。)

glibc不是一个.so (动态库)文件 – 有一堆,但libc和libm是最常用的两个。 所有的静态和动态库都存储在/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源代码):