glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库还会依赖于glibc。glibc不仅封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。因为glibc涵盖了几乎所有的UNIX通行的标准,可以想见其内容包罗万象。而如同其他的UNIX系统一样,其内含的档案群分散于系统的树形目录结构中,像一个支架通常撑起整个操作系统。在GNU/Linux系统中,其C函式库发展史点出了GNU/Linux演化的几个重要里程碑,用glibc作为系统的C函式库,是GNU/Linux演变的一个重要里程碑。
newlibc库是一个开源的c函数库,包括libc和libm两部份。它支持ANSIC库标准,针对不同处理器构架进行优化,轻量级,适用于嵌入式系统。
一.GLIBC
glibc是一种根据LGPL许可合同发布的C函数库,是程序运行时使用到的一些API集合,它们通常是已预先编译好,以二补码代码方式存在于Linux类系统中,glibc一般作为GNUC编译程序的一个部分发布。它最初是自由软件基金会为其GNU操作系统所写,但目前最主要的应用是配合Linux内核,成为GNU/Linux操作系统一个重要的组成部份。
在通用的PC和Server中,Linux(ubuntu,Redhat,CentOSetc.)默认提供对glibc的支持;并且在嵌入式应用中,考虑到系统对os大小的要求和简化系统的复杂度等诱因linux 版本,并不一定支持glibc,而是支持uClibc、newLib等针对嵌入式应用的C函数库。这就要求在嵌入式系统开发的过程中,须要评估应用对glibc的依赖程度,评估程序开发或移植的工作量和复杂度。
glibc是linux系统中最底层的api(应用程序开发插口),几乎其它任何的运行库就会依赖于glibc。glibc不仅封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现,关于glibc功能的介绍可以在其官方网站上获取到详尽的指南资料()。
主要的功能如下(摘自glibc指南):
(1)ErrorReporting,进行错误类型的检查和报告(howerrorsdetectedbythelibraryarereported)
(2)LanguageFeatures,supportforstandardpartsoftheClanguage,includingthingslikethesizeofoperatorandthesymbolicconstantNULL,howtowritefunctionsacceptingvariablenumbersofarguments,andconstantsdescribingtherangesandotherpropertiesofthenumericaltypes.Thereisalsoasimpledebuggingmechanismwhichallowsyoutoputassertionsinyourcode,andhavediagnosticmessagesprintedifthetestsfail.
(3)Memory,动态显存的分配和管理(describestheGNUlibrary'sfacilitiesformanagingandusingvirtualandrealmemory,includingdynamicallocationofvirtualmemory.Ifyoudonotknowinadvancehowmuchmemoryyourprogramneeds,youcanallocateitdynamicallyinstead,andmanipulateitviapointers.)
(4)字符、字符串及链表的处理CharacterHandlingisaboutcharacterclassificationfunctions(suchasisspace)andfunctionsforperformingcaseconversion.StringandArrayUtilities,includefunctionsformanipulatingstrings(null-terminatedcharacterarrays)andgeneralbytearrays,includingoperationssuchascopyingandcomparison.
(5)标准IO的支持
(6)文件操作的支持(FileSystemInterface,suchasfunctionsfordeletingandrenamingthemandforcreatingnewdirectories.alsocontainsinformationabouthowyoucanaccesstheattributesofafile,suchasitsownerandfileprotectionmodes.)
(7)进程间通信的支持(PipesandFIFOs,Pipesallowcommunicationbetweentworelatedprocesses(suchasbetweenaparentandchild),whileFIFOsallowcommunicationbetweenprocessessharingacommonfilesystemonthesamemachine.)
(8)网路的支持(socket)
(9)虚拟终端设备的管理,及系统的安全访问(Low-LevelTerminalInterface,changetheattributesofaterminaldevice.disableechoofcharacterstypedbytheuser,forexample,readthischapter.)
(10)物理及运算库的支持(定点运算和浮点库)
(11)查找和分类的支持(SearchingandSorting)
(12)模式匹配的支持(PatternMatching)
(13)时间及定时器的管理
(14)不同字符集的编码转换
(15)国际化的支持,选择不同的语言种类和国家
(16)Non-LocalExits(provideafacilityforgoto-likejumpswhichcanjumpfromonefunctiontoanother.)
(17)讯号量的支持(SignalHandling,establishahandlerthatiscalledwhenaparticularkindofsignalisdelivered,andhowtopreventsignalsfromarrivingduringcriticalsectionsofyourprogram.)
(18)进程编程和进程控制(processandJobcontrol)
(19)用户管理和系统管理(UserDatabaseandSystemManagement)等
二.uClibc
uClibc是一个面向嵌入式Linux系统的大型的C标准库。最初uClibc是为了支持uClinux而开发,这是一个不须要显存管理单元的Linux版本,因而适宜于微控制器系统(uCs;此处"u"是代表"micro"的μ的罗马化).[2]
uClibc比通常用于Linux发行版的C库GNUCLibrary(glibc)要小得多,glibc目标是要支持最大范围的硬件和内核平台的所有C标准,而uClibc专注于嵌入式Linux.好多功能可以按照空间需求进行抉择。
uClibc运行于标准的以及无MMU的Linux系统上中文linux操作系统,支持tile,i386,x8664,ARM(big/littleendian),AVR32,Blackfin,h8300,m68k,MIPS(big/littleendian),PowerPClinux 发行版 共享,SuperH(big/littleendian),SPARC,和v850等处理器。
uClibc和Glibc并不相同,二者有许多不同之处,但是以下不同有可能给你带来一些问题.
1.uClibc比Glibc小,即使uClibc和Glibc在已有的插口上是兼容的,并且采用uClibc编译应用程序比采用Glibc编译应用程序要更便捷,然而uClibc并没有包括Glibc中的所有插口实现,因而有些应用可能在uClibc中不能编译。
2.uClibc在可配置性上比Glibc要好。
3.uClibc并不能保证发布的库二补码兼容旧版本uClibc库。当一个新的版本uClibc库被发布,则可能须要也可能不须要重新编译应用程序。
4.uClibc没有提供用于数据插口的库(libdb)。
5.uClibc不支持NSS(/lib/libnss_*),在这方面Glibc更容易支持不同形式的认证和DNS解析。uClibc仅仅支持采用flat口令文件或则shadow口令文件储存授权信息。假如须要比那些更复杂的的授权,可以编译安装pam。
6.uClibc中的libresolv库仅仅是一个桩。Glibc的libresolv库中的部份并不是全部的功能uClibc都提供,许多函数都没有实现。
7.提供网路信息服务支持(NIS)libnsl库(最初被称为黄页YP),被SUN扩充为发明为RPC并用于网路共享Unix口令文件
。个人觉得NIS是一个令人讨厌的东西并应当使用。为此,在实现相同的功能情况下采用ldap比NIS更有效。uClibc其实提供一个桩libnsl,但并不支持NIS。我们因而也不提供在Glibc下提供的坐落/usr/include/rpcsvc里的头文件。
8.uClibc的区域支持并不是100%的完全。正在这方面努力
9.uClibc的数据功能函数库内部仅仅支持longdouble,设置对于longdouble的支持也是十分有限。与此对应的只实现了较少的物理函数。倘若应用程序采用double类型,则会程序会运行得较好。
10.uClibc的libcrpt库不支持可重入crypt_r,setkey_r和encrypt_r,由于这种也不是SuSv3所规定的。
11.uClibc直接采用内核的数据类型去定义大多数透明的数据类型。
12.uClibc支持采用linux内核结构特有的结构体"structstat"。
13.uClibc的运行时库librt当前缺乏aio插口、全部的时钟插口和共享显存插口(仅仅实现定时器插口和消息队列插口)
三.newlib
Newlib是一个面向嵌入式系统的C运行库。最初是由CygnusSolutions搜集组装的一个源代码集合,起名为newlib,如今由RedHat维护。
对于与GNU兼容的嵌入式C运行库,Newlib并不是惟一的选择,而且newlib是比较优秀和成熟度比较高的一个。newlib具有奇特的体系结构,致使它才能十分好地满足深度嵌入式系统的要求。newlib可移植性强,具有可重入特点、功能完备等特性,已广泛应用于各类嵌入式系统中。
newlib是一个用于嵌入式系统的开放源代码的C语言程序库,由libc和libm两个库组成,特征是轻量级,速率快,可移植到好多CPU结构上。newlib实现了许多复杂的功能,包括字符串支持,浮点运算,显存分配(如malloc)和I/O流函数(printflinux 发行版 共享,fprinf()等)。其中libc提供了c语言库的实现,而libm提供了浮点运算支持。
在使用gcc编译器时,对gcc指定不同的配置选项时,使用的C语言库就不同,默认情况是下使用glibc,可以通过--with-newlib选择使用newlib.
文章评论