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

标签 c linux gnu

当我们使用 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 还有其他替代实现。

关于c - libc(glibc) 在我们的 linux 应用程序中的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11372872/

相关文章:

linux - 我该如何修复这个损坏的 rpmdb?

c - strcmp 没有正确比较字符串

c - 什么时候应该将 errno 分配给 ENOMEM?

c - 这两个定义有什么区别

linux - 我如何使用 Ansible lineinfile 删除除少数特定行以外的所有行?

php - 我有一个网站,当我将一个页面放在根目录中时它工作正常,但在文件夹中我收到错误?

linux - 使用 GNU objcopy 从 Elf 生成可执行二进制文件

c++ - gnu++0x 标准的 GNU 版本问题

c - 未知类型名称 - MINGW 中的 'DEV_BROADCAST_DEVICEINTERFACE'

c - 读取文件。如何将字符串放入字符数组?