当我们使用gdb调试程序时,我们通常会看到在libc(glibc?)中定义了奇怪名称的函数.我的问题是:
> libc / glibc是strcpy,strlen,malloc等标准C/C++函数的标准实现吗?
>或者,它不仅是第一次使用如上所述,还是Unix / Linux系统调用的包装,如open,close,fctl?如果是这样,为什么我们不能直接发出系统调用,没有libc?
> libc只包含一个lib(.a或.so)文件,还是许多lib文件(在这种情况下,libc是这组lib的通用名称)?这些lib文件驻留在哪里?
> libc和glibc有什么区别?
解决方法:
libc实现标准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的其他替代实现.