当我们使用 gdb
调试程序时,我们通常会看到在 libc
(glibc
?) 中定义的具有奇怪名称的函数。我的问题是:
libc/glibc
是strcpy
、strlen
、malloc
等一些标准C/C++函数的标准实现吗>?- 或者,它不仅是如上所述的第一个用法,而且还是 Unix/Linux 系统调用的包装器,如
open
、close
、fctl
?如果是这样,为什么我们不能直接发出系统调用,而不使用libc
? libc
是只包含一个 lib(.a
或.so
)文件,还是多个 lib 文件(在本例中为libc
是这组库的总称)?这些 lib 文件位于何处?libc
和glibc
有什么区别?
最佳答案
libc
实现标准 C 函数,如 strcpy()
和 POSIX 函数(可能是系统调用),如 getpid()
。请注意,并非所有标准 C 函数都在 libc
中 - 大多数数学函数都在 libm
中。
您不能像调用普通函数一样直接进行系统调用,因为对内核的调用不是普通函数调用,因此链接器无法解析它们。相反,特定于体系结构的汇编语言 thunk 用于调用内核 - 您当然也可以直接在自己的程序中编写这些,但您不需要,因为 libc
为您提供了它们。
请注意,在 Linux 中,提供 POSIX API 的是内核和 libc
的组合。 libc
增加了相当多的值(value) - 并非每个 POSIX 函数都必须是系统调用,而且对于那些,内核行为并不总是符合 POSIX。
libc
是一个单独的库文件(.so
和 .a
版本都可用)并且在大多数情况下驻留在 /usr/lib
.但是,glibc (GNU libc) 项目提供的不仅仅是 libc
- 它还提供了前面提到的 libm
以及其他核心库,例如 libpthread
.所以 libc
只是 glibc 提供的库之一 - 除了 glibc 之外,libc
还有其他替代实现。
关于c - libc(glibc) 在我们的 linux 应用程序中的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11372872/