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

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

  1. libc/glibcstrcpystrlenmalloc等一些标准C/C++函数的标准实现吗>?
  2. 或者,它不仅是如上所述的第一个用法,而且还是 Unix/Linux 系统调用的包装器,如 openclosefctl ?如果是这样,为什么我们不能直接发出系统调用,而不使用 libc
  3. libc 是只包含一个 lib(.a.so)文件,还是多个 lib 文件(在本例中为 libc 是这组库的总称)?这些 lib 文件位于何处?
  4. libcglibc有什么区别?

最佳答案

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 还有其他替代实现。

https://stackoverflow.com/questions/11372872/

相关文章:

mysql - 你能推荐一个免费的 Linux 轻量级 MySQL GUI 吗?

python - 从终端调用时使用默认 Python 而不是 Anaconda 安装

c - 如何在基于 Linux 的系统上的 c 程序中使用 mqueue?

linux - 如何阅读有关内置 zsh 命令的文档?

linux - 如何使用 curl 或 wget 将文件下载到目录中?

php - 如何为 php 启用 mysqlnd?

linux - 永久更改 GDB 中的反汇编风格

linux - 如何在不创建父目录的情况下使用 wget 镜像目录?

linux - Bash:WAITING超时

linux - 使用非 root 用户帐户安装 Git