libc库不仅实现标准C语言中的函数,而且也包含自己所属的函数接口。比如在glibc库中,既包含标准C中的fopen(),又包含类Unix系统中的open()。在类Unix操作系统中,如果缺失了标准库,那么整个操作系统将不能正常运转。
而Windows系统并不将libc库作为整个核心操作系统的一部分。通常每个编译器都附属自己的libc库,这些libc既可以静态编译到程序中,又可以动态编译到程序中。也就是说应用程序依赖编译器而不是操作系统。
封装函数
在Linux系统中,glibc库中包含许多API,大多数API都对应一个系统调用,比如应用程序中使用的接口open()就对应同名的系统调用open()。
glibc库中通过封装例程(Wrapper Routine)将API和系统调用关联起来。
API是头文件中所定义的函数接口,而位于glibc中的封装例程则是对该API对应功能的具体实现. 事实上接口open()所要完成的功能是通过系统调用open()完成的,因此封装例程要做的工作是先将接口open()中的参数复制到相应寄存器中,然后引发一个异常,从而系统进入内核去执行sys_open(),最后当系统调用执行完毕后,封装例程还要将错误码返回到应用程序中。
【注意】函数库中的API和系统调用并没有一一对应的关系。应用程序借助系统调用可以获得内核所提供的服务,像字符串操作这样的函数并不需要借助内核来实现,因此也就不必与某个系统调用关联。也不是必须通过封装例程才能使用系统调用,syscall()和_syscallx()两个函数可以直接调用系统调用。
glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现,主要的如下:
(1)string,字符串处理
(2)signal,信号处理
(3)dlfcn,管理共享库的动态加载
(4)direct,文件目录操作
(5)elf,共享库的动态加载器,也即interpreter
(6)iconv,不同字符集的编码转换
(7)inet,socket接口的实现
(8)intl,国际化,也即gettext的实现
(9)io
(10)linuxthreads
(11)locale,本地化
(12)login,虚拟终端设备的管理,及系统的安全访问
(13)malloc,动态内存的分配与管理
(14)nis
(15)stdlib,其它基本功能
可以执行libc.so.6来获取信息,需要携带路径,如果不知道lib.so.6在哪个文件中,可以执行find / -name libc.so.6来定位文件位置
zbb@ubuntu:~$ sudo find / -name lib.so.6
[sudo] password for zbb:
find: ‘/run/user/108/gvfs’: Permission denied
zbb@ubuntu:~$ sudo find / -name libc.so.6
/lib/x86_64-linux-gnu/libc.so.6
find: ‘/run/user/108/gvfs’: Permission denied
/lib32/libc.so.6
find: ‘/proc/37558’: No such file or directory
find: ‘/proc/37559’: No such file or directory
/libx32/libc.so.6
针对64位系统使用命令:
zbb@ubuntu:~$ ls -l /lib/x86_64-linux-gnu/libc.so.6
lrwxrwxrwx 1 root root 12 Feb 6 2019 /lib/x86_64-linux-gnu/libc.so.6 -> libc-2.23.so
针对32位系统使用命令:
zbb@ubuntu:~$ ls -l /lib/i386-linux-gnu/libc.so.6
使用命令
zbb@ubuntu:~$ apt-cache show libc6
Package: libc6
Architecture: amd64
Version: 2.23-0ubuntu11
Multi-Arch: same
Priority: required
Section: libs
Source: glibc
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 10953
Depends: libgcc1
Suggests: glibc-doc, debconf | debconf-2.0, locales
Breaks: hurd (<< 1:0.5.git20140203-1), libtirpc1 (<< 0.2.3), locales (<< 2.23), locales-all (<< 2.23), lsb-core (<= 3.2-27), nscd (<< 2.23)
Replaces: libc6-amd64
Filename: pool/main/g/glibc/libc6_2.23-0ubuntu11_amd64.deb
Size: 2576636
MD5sum: 9fa554db26eaa705ff02cab4e0289e4f
SHA1: 6228335ebf0b5426f2d220baaabf1083e1401e8e
SHA256: 7c802a3051203c32bba4e2e1c6cab831c338c186810bc5cab59fc600a63ac8e0
Homepage: http://www.gnu.org/software/libc/libc.html
Description-en: GNU C Library: Shared libraries
Contains the standard libraries that are used by nearly all programs on
the system. This package includes shared versions of the standard C library
and the standard math library, as well as many others.
Description-md5: fc3001b0b90a1c8e6690b283a619d57f
Task: minimal
Supported: 5y
...
从中我们可以获取自己需要的libc的版本信息
➜ ~ rpm -qa |grep glibc
glibc-devel-2.17-157.el7_3.5.x86_64
glibc-2.17-157.el7_3.5.x86_64
glibc-common-2.17-157.el7_3.5.x86_64
glibc-headers-2.17-157.el7_3.5.x86_64
➜ ~ ls -l /lib64/libc.so.6
lrwxrwxrwx 1 root root 12 Aug 18 2017 /lib64/libc.so.6 -> libc-2.17.so
查找对应版本进行下载源代码
glibc2.27文档
自glibc2.27起 pow10, pow10f and pow10l 函数被取消