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

bas*_*bie 48 c linux gnu

当我们使用gdb调试程序时,我们通常会看到在libc(glibc?)中定义了奇怪名称的函数.我的问题是:

  1. libc/glibc是一些标准C/C++函数的标准实现,如"strcpy","strlen","malloc"?
  2. 或者,它不仅是如上所述的第一次使用,还是Unix/Linux系统调用的包装,如"open","close","fctl"?如果是这样,为什么我们不能直接发出系统调用,没有libc?
  3. libc只包含一个lib(.a或.so)文件,还是许多lib文件(在这种情况下,libc是这组lib的通用名称)?这些lib文件驻留在哪里?
  4. libc和glibc有什么区别?

caf*_*caf 69

libc同时实现标准C函数strcpy()和POSIX函数(可能是系统调用)getpid().请注意,并非所有标准C函数都在libc- 大多数数学函数都在libm.

您不能以调用普通函数的方式直接进行系统调用,因为对内核的调用不是正常的函数调用,因此链接器无法解析它们.相反,特定于体系结构的汇编语言thunk用于调用内核 - 您当然也可以直接在自己的程序中编写它们,但是您不需要因为libc它们为您提供它们.

请注意,在Linux中,它是内核的组合,并libc提供POSIX API. libc添加了相当数量的值 - 并非每个POSIX函数都必须是系统调用,而对于那些函数,内核行为并不总是符合POSIX.

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


dus*_*uff 18

关于前两个,glibc既是C标准库(例如,"标准C函数"),也是系统调用的包装器.你不能直接发出系统调用,因为编译器不知道如何 - glibc包含发出系统调用所必需的"粘合剂",这是用汇编语言编写的.(有可能自己重新实现,但它比它的价值要麻烦得多.)

(C++标准库是一个单独的东西;它被称为libstdc++.)

glibc不是一个单独的.so(动态库)文件 - 有一堆,但libc和libm是最常用的两个.所有静态和动态库都存储在/lib.

libc是一个通用术语,用于指代所有C标准库 - 有几个.glibc是最常用的一种; 其他包括eglibc,uclibc和dietlibc.


pau*_*sm4 6

这是“标准库”。它就像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
Run Code Online (Sandbox Code Playgroud)

此链接应该可以回答您可能遇到的任何其他问题(包括对完整 GLibc 源代码的引用):