glibc,uclibc,eglibc,musl-libc区别和联系
2016-03-25 15:34:17 阿炯

Libc

Linux操作系统运行时的基础库,提供了各类操作的基本调用。它的实现也有多种,以适应不同的应用环境。本文就着重介绍它们之前的区别和联系。

1、Glibc glibc = GNU C Library
是GNU项(GNU Project)目,所实现的C语言标准库(C standard library)。广泛存在于目前最常见的桌面和服务器中的GNU/Linux类的系统中,都是用的这套C语言标准库。它实现了常见的C库的函数,支持很多种系统平台,功能很全,但是也相对比较臃肿和庞大。如果出现漏洞也影响巨大,如 glibc 幽灵漏洞等。

2、uClibc 一个小型的C语言标准库,主要用于嵌入式。
其最开始设计用于uClinux(注:uClinux不支持MMU),因此比较适用于微处理器中。 对应的,此处的u意思是μ,Micro,微小的意思。 uClibc的特点: (1)uClibc比glibc要小很多。 (2)uClibc是独立的,为了应用于嵌入式系统中,完全重新实现出来的。和glibc在源码结构和二进制上,都不兼容。

3、EGLIBC EGLIBC = Embedded GLIBC
EGLIBC是(后来)glibc的原创作组织FSF所(新)推出的,glibc的一种变体,目的在于将glibc用于嵌入式系统。EGLIBC的目标是:
(1)保持源码和二进制级别的兼容于Glibc源代码架构和ABI层面兼容,如果真正实现了这个目标,那意味着之前用glibc编译的程序,可以直接用eglibc替换,而不需要重新编译。这样就可以复用之前的很多的程序了。

(2)降低(内存)资源占用/消耗。

(3)使更多的模块为可配置的(以实现按需裁剪不需要的模块)。

(4)提高对于交叉编译(cross-compilation)和交叉测试(cross-testing)的支持。

Eglibc的最主要特点就是可配置,这样对于嵌入式系统中,你所不需要的模块,比如NIS,locale等,就可以裁剪掉,不把其编译到库中,使得降低生成的库的大小了。

Eglibc的特点
1.写程序,需要用到很多c语言的库函数。所有的库函数加起来,就是对应的C语言(标准)函数库。

2.目前在普通GNU/Linux系统中所用的C语言标准库,叫做glibc。其功能很全,函数很多,但是代码太多,编译出来的函数库的大小也很大,即资源占用也很多。

3.而嵌入式系统中,也需要C语言写代码实现特定功能,也需要用到C语言函数库,但是由于嵌入式系统中,一般资源比较有限,所以不适合直接使用(太占用资源的)gLibc。

4.所以有人就又(没有参考glibc,而是从头开始,)重新实现了一个用于嵌入式系统中的,代码量不是很大的,资源占用相对较少的,C语言函数库,叫做uClibc。并且,uClibc不支持MMU(内存管理单元)。

5. 而后来glibc的开发者又推出个Embedded glibc,简称eglibc,其主要目的也是将glibc用于嵌入式领域。相应最大的改动就在于,把更多的库函数,改为可配置的,这样如果你的嵌入式系统中不需要某些函数,就可以裁剪掉,不把该函数编译到你的eglibc库中,使得最终生成的eglibc库的大小变小,最终符合你的嵌入式系统的要求(不能超过一定的大小),这样就实现了,把glibc引用于嵌入式系统中的目的了。

这样复杂多变使得一些主流发行版本在它们之间切换,Debian就用GLIBC替代EGLIBC

可以简单的理解为: glibc,uClibc,eglibc都是C语言函数库:
1. uClibc是嵌入式系统中用的,glibc是桌面系统用的
2. eglibc也是嵌入式系统中用的,是glibc的嵌入式版本,和glibc在源码和二进制上兼容。

4、Musl-libc
C语言标准库Musl-libc项目发布了1.0版。Musl是一个轻量级的C标准库,设计作为GNU C library (glibc)、 uClibc或Android Bionic的替代用于嵌入式操作系统和移动设备。它遵循POSIX 2008规格和 C99 标准,采用MIT许可证授权,使用Musl的Linux发行版和项目包括sabotage,bootstrap-linux,LightCube OS等等。它是从零开始设计的。一是希望让静态链接更高效;二是现有的C标准库在一些极端条件下表现很糟糕,竞态条件、资源不足时常常会出问题,而Musl试图避免它们来达到较高的实时鲁棒性。其动态运行时只有一个文件,有稳定的ABI,因此可以实现无竞态的版本升级。对静态链接的支持也让可移植单文件应用部署成为可能,且不会使文件体积膨胀很多。

5、dietlibc

dietlibc是一种轻量化的C标准库。它是自由软件,由菲力·冯·勒特那(Felix von Leitner)所开发,以GPLv2许可协议公开发行。其设计目标是作出一个尽可能小的C标准库,因此它并没有完全实现出所有glibc的函数,只保留了最重要以及最常用的部分。因为它的精简特性,经常在嵌入式系统中被使用。

Glib

它是gtk+的基础库,它由基础类型、对核心应用的支持、实用功能、数据类型和对象系统五个部分组成,可以在其官方网站下载其源代码。这是一个综合用途的实用的轻量级的C程序库,它提供C语言的常用的数据结构的定义、相关的处理函数,有趣而实用的宏,可移植的封装和一些运行时机能,如事件循环、线程、动态调用、对象系统等的API。gtk+与glib都是可移植的,glib最有名的就是GNOME桌面环境了。


几种C库的综合比较(musl uClibc dietlibc glibc)
Bloat comparisonmusluClibcdietlibcglibc
Complete .a set426k500k120k2.0M †
Complete .so set527k560k185k7.9M †
Smallest static C program1.8k5k0.2k662k
Static hello (using printf)13k70k6k662k
Dynamic overhead (min. dirty)20k40k40k48k
Static overhead (min. dirty)8k12k8k28k
Static stdio overhead (min. dirty)8k24k16k36k
Configurable featuresetnoyesminimalminimal
Behavior on resource exhaustionmusluClibcdietlibcglibc
Thread-local storagereports failureabortsn/aaborts
SIGEV_THREAD timersno failuren/an/alost overruns
pthread_cancelno failureabortsn/aaborts
regcomp and regexecreports failurecrashesreports failurecrashes
fnmatchno failureunknownno failurereports failure
printf familyno failureno failureno failurereports failure
strtol familyno failureno failureno failureno failure
Performance comparisonmusluClibcdietlibcglibc
Tiny allocation & free0.0050.0040.0130.002
Big allocation & free0.0270.0180.0230.016
Allocation contention, local0.0480.1340.3930.041
Allocation contention, shared0.0500.1320.3940.062
Zero-fill (memset)0.0230.0480.0550.012
String length (strlen)0.0810.0980.1610.048
Byte search (strchr)0.1420.2430.1980.028
Substring (strstr)0.0571.2731.0300.088
Thread creation/joining0.2480.12645.7610.142
Mutex lock/unlock0.0420.0550.7850.046
UTF-8 decode buffered0.0730.1400.2570.351
UTF-8 decode byte-by-byte0.1530.3950.2360.563
Stdio putc/getc0.2700.8087.7910.497
Stdio putc/getc unlocked0.2000.2820.2690.144
Regex compile0.0580.0410.0140.039
Regex search (a{25}b)0.1880.1880.9670.137
Self-exec (static linked)234µs245µs272µs457µs
Self-exec (dynamic linked)446µs590µs675µs864µs
ABI and versioning comparisonmusluClibcdietlibcglibc
Stable ABIyesnounofficiallyyes
LSB-compatible ABIincompletenonoyes
Backwards compatibilityyesnounofficiallyyes
Forwards compatibilityyesnounofficiallyno
Atomic upgradesyesnonono
Symbol versioningnononoyes
Algorithms comparisonmusluClibcdietlibcglibc
Substring search (strstr)twowaynaivenaivetwoway
Regular expressionsdfadfabacktrackingdfa
Sorting (qsort)smoothsortshellsortnaive quicksortintrosort
Allocator (malloc)musl-nativedlmallocdiet-nativeptmalloc
Features comparisonmusluClibcdietlibcglibc
Conformant printfyesyesnoyes
Exact floating point printingyesnonoyes
C99 math libraryyespartialnoyes
C11 threads APIyesnonono
C11 thread-local storageyesyesnoyes
GCC libstdc++ compatibilityyesyesnoyes
POSIX threadsyesyes, on most archsbrokenyes
POSIX process schedulingstubincorrectnoincorrect
POSIX thread priority schedulingyesyesnoyes
POSIX localedefnononoyes
Wide character interfacesyesyesminimalyes
Legacy 8-bit codepagesnoyesminimalslow, via gconv
Legacy CJK encodingsnononoslow, via gconv
UTF-8 multibytenative; 100% conformantnative; nonconformantdangerously nonconformantslow, via gconv; nonconformant
Iconv character conversionsmost major encodingsmainly UTFsnothe kitchen sink
Iconv transliteration extensionnononoyes
Openwall-style TCB shadowyesnonono
Sun RPC, NISnoyesyesyes
Zoneinfo (advanced timezones)yesnoyesyes
Gmon profilingnonoyesyes
Debugging featuresnononoyes
Various Linux extensionsyesyespartialyes
Target architectures comparisonmusluClibcdietlibcglibc
i386yesyesyesyes
x86_64yesyesyesyes
x86_64 x32 ABI (ILP32)experimentalnononon-conforming
ARMyesyesyesyes
Aarch64 (64-bit ARM)experimentalnonoyes
MIPSyesyesyesyes
SuperHexperimentalyesnoyes
Microblazeyespartialnoyes
PowerPCyesyesyesyes
Sparcnoyesyesyes
Alphanoyesyesyes
S/390nonoyesyes
OpenRISC 1000 (or1k)yesnononot upstream
MMU-less microcontrollersnoyesnono
Build environment comparisonmusluClibcdietlibcglibc
Legacy-code-friendly headerspartialyesnoyes
Lightweight headersyesnoyesno
Usable without native toolchainyesnoyesno
Respect for C namespaceyesLFS64 problemsnoLFS64 problems
Respect for POSIX namespaceyesLFS64 problemsnoLFS64 problems
Security/hardening comparisonmusluClibcdietlibcglibc
Attention to corner casesyesyesnotoo much malloc
Safe UTF-8 decoderyesyesnoyes
Avoids superlinear big-O'syessometimesnoyes
Stack smashing protectionyesyesnoyes
Heap corruption detectionyesnonoyes
Misc. comparisonsmusluClibcdietlibcglibc
LicenseMITLGPL 2.1GPL 2LGPL 2.1+ w/exceptions