glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。由于glibc囊括了几乎所有的UNIX通行的标准,可以想见其内容包罗万象。而就像其他的UNIX系统一样,其内含的档案群分散于系统的树状目录结构中,像一个支架一般撑起整个操作系统。在GNU/Linux系统中,其C函式库发展史点出了GNU/Linux演进的几个重要里程碑,用glibc作为系统的C函式库,是GNU/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,其它基本功能
Glibc的内容
由于glibc囊括了几乎所有的UNIX通行的标准,可以想见其内容包罗万有。而就像其他的UNIX系统一样,其内含的档案群分散于系统的树状目录结构中,像一个支架一般撑起整个作业系统。以glibc-2.2为例,这些档案群主要包括:
1.分享函式库群:
这是glibc的主体,分布/lib与/usr/lib中,包括libc标准C函式库、libm数学函式库、libcrypt加密与编码函式库、libdb资料库函式库、libpthread行程多执行绪函式库、libnss网路服务函式库….等等。这些都是可分享函式库,档名都以.so做结尾。其中,/lib/ld*.so是程式与函式库连结的工具。有的用于程式编译时将程式与函式库内的函式物件连结,在只支援静态连结的系统中,此连结方式就是直接将所需的物件自函式库中抽出?砼c程式的可执行档相连,而在支援可分享函式库的系统中,在程式编译时期的连结只是在执行档中纪录了那些函式物件是存在那个函式库档案中,等该程式开始执行时,则由另一个负责动态连结的ld*.so将所需的函式库连结好?K执行。
一般而言,负责程式编译时期的连结器档名为ld.so,而负责程式执行时的动态连结器档名为ld-.so或ld-linux.so(在GNU/Linux系统中)。
函式库标头档与程式开发元件:
这些标头档档名都以.h为结尾,全部在/usr/include/底下,其内容为函式库中各函式的宣告、巨集定义、资料物件的型别….等等,这些都是程式开发者不可或缺的部分。
除此之外,在/usr/lib/中还有若干.o与.a的档案,这些是程式编译过程中要连结为可执行档时所需的元件,有些则为上述可分享函式库的静态连接版本,而后者可以在某些特殊场合下需要静态连结程式时使用。
函式库说明文件:
在一般的UNIX系统下,这些说明文件是放在/usr/man或/usr/share/man底下,统称为manpages,其底下还分若干章节,其中第二章(man2)讲的是系统呼叫,而第三章(man3)讲的就是libc标准函式库,这些都是系统开发者重要的参考资料。
而在GNU的系统中,除了manpages之外,还有一套称为info的文件资料系统,而且里头的说明往往比manpages还要详尽,这在glibc中也不例外。glibc的info文件位于/usr/share/info/libc.info*,本文中有许多素材就是取自这些文件的内容。
字集转换模组与区域化资料库:
这些是与程式国际化与本土化相关的部分,主要可分成四大块:/usr/lib/gconv/内含大量的字集转换模组,大部分是各种字集及编码方式与系统的基底字集之间的转换。第二块是/usr/lib/locale,内含以系统基底字集写成的区域化资料库(locale),像是LC_CTYPE、LC_TIME….等等。第三块是/usr/share/locale/,内含可跨平台使用的区域化资料,主要是各应用程式的信息翻译部分。而最后一块是/usr/share/i18n/,其内容是各区域化资料库的原始码,以及系统支援的内码对应表….等等。
时区资料库:
主要分别在/usr/share/zoneinfo底下,内含世界各地时区与格林威治时间的转换资料。
其他工具程式与设定档:
工具程式分?言/usr/bin与/sbin底下,包括一些转码与区域化资料库相关的程式如iconv,locale,localedef等,以及用?盹@示应用程式与可分享函式库相依关系的ldd,还有可分享函式库搜寻路?焦芾沓淌ldconfig….等。而其相关的设定档则位于/etc底下。
disaos
03-11-03,10:42
GLIBC的规格
在GNU/Linux系统中,其C函式库的发展史点出了GNU/Linux演进的几个重要里程碑,由此可以突显出C函式库在系统中的地位与重要性。早期的GNU/Linux系统?K不支援可分享函式库,因此所有的应用程式都是以静态连结的方式存于系统中。直到1995-1996年libc5问世以后,系统才开始支援ELF可分享函式库,同时该版的C函式库也?作了其他UNIX上大部分的功能与函式群,可谓GNU/Linux发展上的一大进步。
然而libc5在程式国际化(I18N)与本土化(L10N)方面的支援很差,故那个时候若要开发所谓中文化的程式,就非得自行?作一套标准不可。直到一两年后,GNU/Linux换用了GNU所开发的glibc-2.0做为其C函式库后,其国际化与本土化的支援才开始起步,后?须v经glibc-2.1,到了现在的2.2版,整个多国语文的开发环境才大至成熟。
用glibc做为系统的C函式库,是GNU/Linux演进的一个重要里程碑。在GNU的计划中,开发glibc原本是要给他们尚未问世的核心GNU/HURD用的,由于当时几乎99%的GNU系统工具已开发完成,就独缺核心Hurd,而恰巧Linux核心在Torvalds的带领下已逐?u成熟稳定,而且可以顺利执行所有的GNU系统工具。故GNU团队便顺应Linux核心的特性,改写了他们的glibc,使其可以适用于Hurd核心与Linux核心。如此,在这两个平台上就有了一致的程式开发环境,使得所有的GNU程式可以在这两个平台之间顺利移植。
比起过去的libc5,glibc系列(一般又称之为libc6)除了有完整的国际化与本土化支援外,同时还符合许多标准与规格,使得在glibc下开发的程式可以很容易移植到其他UNIX平台去。这些标准包括:
ISOC:
ISOC是InternationalStandardfortheCprogramminglanguage的缩写,此标准明定了C语言的语法,标准C函式库应具备那些标头档、巨集定义、函式与物件….等等,几乎在任何平台上的C语言(包括非UNIX平台)都支援此标准。
POSIX:
POSIX是PortableOperatingSystemInterfaceforComputerEnvironments的缩写,它是ISOC的延伸,明定了一个可移植的作业系统所应具备种种条件,其范围不只有系统函式库而已,还同时包括一些标准的工具程式、系统核心应有的特色与?作、以及在C函式库中某些与作业系统相关的低阶控制支援(如系统呼叫窗口)等等。由于glibc是完全按照POSIX的标准制作的,同时搭配了符合POSIX标准的Linux核心,故在此环境下开发的程式可以做到完全符合POSIX的规格。
BerkeleyUnix:
BerkeleyUnix泛称柏克莱大学所开发的UNIX系列作业系统,包括4.2BSD、4.3BSD、4.4BSD以及早期的SunOS。这些系统的C函式库中有许多杰出的设计,但却没有在上述两个标准中,包括select()函式、sockets….等等,这些在glibc中都有支援。
SVID:
SVID是SystemVInterfaceDescription的缩写,它是一份描述AT&TUNIXSystemV系统规格的文件,它是POSIX标准的延伸。Glibc?作了大部分的SVID规格要求,其中较重要的包括了行程之间的通?标准以及分享式记忆体(SharedMemory),至于其他的部分则较不常使用。?作SVID主要的目的是希望可以做到与UNIXSystemV的相容与程式的可移植性。
XPG:
XPG是X/OpenPortabilityGuide的缩写,是由X/OpenCompany,Ltd.所发表,同时X/Open还拥有UNIX商标的版权。而这份规格不但是POSIX标准的扩充,同时也明定了一个UNIX作业系统所应符合的要求。其中包括了iconv()字集转换介面,以及部分BSD与SVID的特色。
除了上述的规格外,glibc还内含了GNU特有的特色,称之为GNUExtension。这些特色在某些情况下可以方便程式的撰写与维护,但就不见得可以移植到其他UNIX平台上,故在可移植性的考量下使用时必须留意。
安装下列程序:catchsegv,gencat,getconf,getent,glibcbug,iconv,iconvconfig,ldconfig,ldd,lddlibc4,locale,localedef,mtrace,nscd,nscd_nischeck,pcprofiledump,pt_chown,rpcgen,rpcinfo,sln,sprof,tzselect,xtrace,zdump和zic
安装下列库文件:ld.so,libBrokenLocale.[a,so],libSegFault.so,libanl.[a,so],libbsd-compat.a,libc.[a,so],libc_nonshared.a,libcrypt.[a,so],libdl.[a,so],libg.a,libieee.a,libm.[a,so],libmcheck.a,libmemusage.so,libnsl.a,libnss_compat.so,libnss_dns.so,libnss_files.so,libnss_hesiod.so,libnss_nis.so,libnss_nisplus.so,libpcprofile.so,libpthread.[a,so],libresolv.[a,so],librpcsvc.a,librt.[a,so],libthread_db.so和libutil.[a,so]
简短说明
catchsegv当程序发生segmentationfault的时候,用来建立一个堆栈跟踪。
gencat建立消息列表。
getconf针对文件系统的指定变量显示其系统设置值。
getent从系统管理数据库获取一个条目。
glibcbug建立glibc的bug报告并且email到bug报告的邮件地址。
iconv转化字符集。
iconvconfig建立快速读取的iconv模块所使用的设置文件。
ldconfig设置动态链接库的实时绑定。
ldd列出每个程序或者命令需要的共享库。
lddlibc4辅助ldd操作目标文件。
locale是一个Perl程序,可以告诉编译器打开或关闭内建的locale支持。
localedef编译locale标准。
mtrace…
nscd提供对常用名称设备调用的缓存的守护进程。
nscd_nischeck检查在进行NIS+侦查时是否需要安全模式。
pcprofiledump打印PCprofiling产生的信息。
pt_chown是一个辅助程序,帮助grantpt设置子虚拟终端的属主,用户组和读写权限。
rpcgen产生实现RPC协议的C代码。
rpcinfo对RPC服务器产生一个RPC呼叫。
sln用来创建符号链接,由于它本身是静态连接的,在动态连接不起作用的时候,sln仍然可以建立符号链接。
sprof读取并显示共享目标的特征描述数据。
tzselect对用户提出关于当前位置的问题,并输出时区信息到标准输出。
xtrace通过打印当前执行的函数跟踪程序执行情况。
zdump显示时区。
zic时区编译器。
ld.so帮助动态链接库的执行。
libBrokenLocale帮助程序处理破损locale,如Mozilla。
libSegFault处理segmentationfault信号,试图捕捉segfaults。
libanl异步名称查询库。
libbsd-compat为了在linux下执行一些BSD程序,libbsd-compat提供了必要的可移植性。
libc是主要的C库–常用函数的集成。
libcrypt加密编码库。
libdl动态连接接口。
libgg++的运行时。
libieeeIEEE浮点运算库。
libm数学函数库。
libmcheck包括了启动时需要的代码。
libmemusage帮助memusage搜集程序运行时内存占用的信息。
libnsl网络服务库。
libnss*是名称服务切换库,包含了解释主机名,用户名,组名,别名,服务,协议等等的函数。
libpcprofile帮助内核跟踪在函数,源码行和命令中CPU使用时间。
libpthreadPOSIX线程库。
libresolv创建,发送及解释到互联网域名服务器的数据包。
librpcsvc提供RPC的其他服务。
librt提供了大部分的POSIX.1b实时扩展的接口。
libthread_db对建立多线程程序的调试很有用。
libutil包含了在很多不同的Unix程序中使用的“标准”函数。
Glibc安装依赖关系
Glibc依赖于:Bash,Binutils,Coreutils,Diffutils,Gawk,GCC,Gettext,Grep,Make,Perl,Sed,Texinfo.
该文章由作者:【有熊】发布,本站仅提供存储、如有版权、错误、违法等相关信息请联系,本站会在1个工作日内进行整改,谢谢!