Linux下C函数库:glibc与newlibc

tycoon 2018-10-06

glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。由于 glibc 囊括了几乎所有的 UNIX 通行的标准,可以想见其内容包罗万象。而就像其他的 UNIX 系统一样,其内含的档案群分散于系统的树状目录结构中,像一个支架一般撑起整个操作系统。在 GNU/Linux 系统中,其C函式库发展史点出了GNU/Linux 演进的几个重要里程碑,用 glibc 作为系统的C函式库,是GNU/Linux演进的一个重要里程碑。

newlib c库是一个开源的c函数库,包括libc和libm两部分。它支持ANSI C库标准,针对不同处理器架构进行优化,轻量级,适用于嵌入式系统。

一. GLIBC

glibc是一种按照LGPL许可协议发布的C函数库,是程序运行时使用到的一些API集合,它们一般是已预先编译好,以二进制代码形式存在于Linux类系统中,glibc通常作为GNU C编译程序的一个部分发布。 它最初是自由软件基金会为其GNU操作系统所写,但目前最主要的应用是配合Linux内核,成为GNU/Linux操作系统一个重要的组成部分。

在通用的PC和Server中,Linux(ubuntu, Redhat, CentOS etc.)默认提供对glibc的支持;但是在嵌入式应用中,考虑到系统对os大小的要求和简化系统的复杂度等因素,并不一定支持glibc,而是支持uClibc、newLib等针对嵌入式应用的C函数库。这就要求在嵌入式系统开发的过程中,需要评估应用对glibc的依赖程度,评估程序开发或移植的工作量和复杂度。

glibc是linux系统中最底层的api(应用程序开发接口),几乎其它任何的运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现,关于glibc功能的介绍可以在其官方网站上获取到详细的手册资料(http://www.gnu.org/software/libc/manual/)。

主要的功能如下(摘自glibc手册):

(1)Error Reporting,进行错误类型的检测和报告(how errors detected by the library are reported)

(2)Language Features, support for standard parts of the C language, including things like the sizeof operator and the symbolic constant NULL, how to write functions accepting variable numbers of arguments, and constants describing the ranges and other properties of the numerical types. There is also a simple debugging mechanism which allows you to put assertions in your code, and have diagnostic messages printed if the tests fail.

(3)Memory, 动态内存的分配和管理 (describes the GNU library's facilities for managing and using virtual and real memory, including dynamic allocation of virtual memory. If you do not know in advance how much memory your program needs, you can allocate it dynamically instead, and manipulate it via pointers.)

(4) 字符、字符串及数组的处理 Character Handling is about character classification functions (such as isspace) and functions for performing case conversion. String and Array Utilities, include functions for manipulating strings (null-terminated character arrays) and general byte arrays, including operations such as copying and comparison.

(5)标准IO的支持

(6)文件操作的支持(File System Interface, such as functions for deleting and renaming them and for creating new directories. also contains information about how you can access the attributes of a file, such as its owner and file protection modes. )

(7)进程间通讯的支持(Pipes and FIFOs, Pipes allow communication between two related processes (such as between a parent and child), while FIFOs allow communication between processes sharing a common file system on the same machine. )

(8)网络的支持(socket)

(9) 虚拟终端设备的管理,及系统的安全访问(Low-Level Terminal Interface, change the attributes of a terminal device. disable echo of characters typed by the user, for example, read this chapter. )

(10)数学及运算库的支持(定点运算和浮点库)

(11)查找和分类的支持(Searching and Sorting)

(12)模式匹配的支持(Pattern Matching)

(13)时间及定时器的管理

(14)不同字符集的编码转换

(15)国际化的支持,选择不同的语言种类和国家

(16)Non-Local Exits (provide a facility for goto-like jumps which can jump from one function to another.)

(17)信号量的支持(Signal Handling, establish a handler that is called when a particular kind of signal is delivered, and how to prevent signals from arriving during critical sections of your program.)

(18)进程编程和进程控制(process and Job control)

(19)用户管理和系统管理(User Database and System Management) 等

二. uClibc

uClibc 是一个面向嵌入式Linux系统的小型的C标准库。最初uClibc是为了支持uClinux而开发,这是一个不需要内存管理单元的Linux版本,因此适合于微控制器系统(uCs;此处"u"是代表"micro"的μ的罗马化).[2]

uClibc比一般用于Linux发行版的C库GNU C Library (glibc)要小得多,glibc目标是要支持最大范围的硬件和内核平台的所有C标准,而uClibc专注于嵌入式Linux.很多功能可以根据空间需求进行取舍。

uClibc运行于标准的以及无MMU的Linux系统上,支持tile, i386,x86 64,ARM (big/little endian), AVR32,Blackfin,h8300,m68k,MIPS (big/little endian), PowerPC,SuperH (big/little endian), 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的数据功能函数库内部仅仅支持long double,设置对于long double的支持也是非常有限。与此对应的只实现了较少的数学函数。如果应用程序采用double类型,则会程序会运行得较好。

10.uClibc的libcrpt库不支持可重入crypt_r,setkey_r和encrypt_r,因为这些也不是SuSv3所规定的。

11.uClibc直接采用内核的数据类型去定义大多数透明的数据类型。

12.uClibc支持采用linux内核结构特有的结构体"struct stat"。

13.uClibc的运行时库librt当前缺少aio接口、全部的时钟接口和共享内存接口(仅仅实现定时器接口和消息队列接口)

三. newlib

Newlib是一个面向嵌入式系统的C运行库。最初是由Cygnus Solutions收集组装的一个源代码集合,取名为newlib,现在由Red Hat维护。

对于与GNU兼容的嵌入式C运行库,Newlib并不是唯一的选择,但是newlib是比较优秀和成熟度比较高的一个。newlib具有独特的体系结构,使得它能够非常好地满足深度嵌入式系统的要求。newlib可移植性强,具有可重入特性、功能完备等特点,已广泛应用于各种嵌入式系统中。

newlib 是一个用于嵌入式系统的开放源代码的C语言程序库,由libc和libm两个库组成,特点是轻量级,速度快,可移植到很多CPU结构上。newlib实现了许多复杂的功能,包括字符串支持,浮点运算,内存分配(如malloc)和I/O流函数(printf,fprinf()等)。其中libc提供了c 语言库的实现,而libm提供了浮点运算支持。

在使用gcc编译器时,对gcc指定不同的配置选项时,使用的C语言库就不同,默认情况是下使用glibc,可以通过--with-newlib选择使用newlib.

Linux下C函数库:glibc与newlibc

相关推荐