当我们使用gdbdebugging一个程序时,我们通常会看到在libc(glibc?)中定义的具有奇怪名字的函数。 我的问题是:
libc
像getpid()
一样同时执行标准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源代码):