Linux glibc版本详解 (linux glibc 版本)

在Linux系统中,glibc(GNU C Library)是一个非常重要的软件库,用于提供对C语言标准库的支持,同时也是运行Linux应用程序所必需的。在Linux发行版中一般会默认安装glibc库,而不同的glibc版本则会带来不同的功能和性能特征。

本文将详细介绍Linux glibc版本的各项特征,包括不同版本的功能、性能、兼容性等方面。

一、glibc的版本历史

首先我们可以回顾一下glibc的版本历史。其最早的版本可以追溯到1991年,当时是在GNU项目下开发的一个C语言库。在1992年2月,glibc的之一个公开版本v1.0发布。此后,随着时间的推移,glibc的版本得到了不断的更新和改进。

以下是glibc的一些重要版本和特征:

– glibc v1.0:1992年发布的之一个公开版本

– glibc v2.0:1996年发布,引入了多线程支持、Locale支持等功能

– glibc v2.2:2023年发布,引入了NPTL线程库、IPv6支持、符号版本等功能

– glibc v2.3:2023年发布,引入了POSIX标准、C99标准等功能

– glibc v2.4:2023年发布,引入了新的malloc实现、64位ABI等功能

– glibc v2.5:2023年发布,引入了新的getaddrinfo实现、FORTIFY_SOURCE等功能

– glibc v2.9:2023年发布,引入了GNU hash表、动态符号表等功能

– glibc v2.11:2023年发布,引入了统一的ISO C95/C99/C11语言标准库、新的定时器实现等功能

– glibc v2.25:2023年发布,引入了AT_RANDOM指针随机化、性能优化等功能

二、glibc版本的功能特征

在Linux系统中,不同的glibc版本会带来不同的功能特征。下面我们就来一一介绍各个版本的主要功能。

(1)glibc v1.0

作为glibc的之一个公开版本,它主要提供了C语言标准库的支持,包括字符串处理、文件操作、数学计算、进程控制等各种常用操作。不过,这个版本还没有支持多线程,也没有支持国际化(i18n)。

(2)glibc v2.0

glibc v2.0是一个重要的版本升级,它引入了很多新的功能。其中最重要的是多线程支持,包括pthread线程库的引入和相关API的实现。此外,这个版本还引入了Locale支持,支持多国语言环境和编码方式。

(3)glibc v2.2

在glibc v2.2中,引入了NPTL(Native Posix Thread Library)线程库,替代了之前的pthread实现,从而提高了多线程的性能和稳定性。此外,这个版本还增加了对IPv6地址的支持,提供了新的getaddrinfo和getnameinfo函数,以及一些新的网络库函数。

另外,glibc v2.2还引入了符号版本,用于解决库的版本问题。这个特性可以让不同版本的函数在同一个二进制文件中同时存在,并且根据不同的链接选项选择不同的版本。

(4)glibc v2.3

在glibc v2.3中,主要引入了POSIX标准和C99标准的支持。该版本支持了一些新的标准库函数,如strndup、asprintf等。此外,这个版本还支持pthread_CONDATTR_DISABLE和pthread_MUTEXATTR_DISABLE等新的线程属性,并提供了新的线程库函数。

(5)glibc v2.4

在glibc v2.4中,引入了新的malloc实现,称为ptmalloc2。这个实现可以对多线程环境进行优化,减少了锁的争用,从而提高了分配内存的性能。此外,这个版本还提供了新的API,如posix_spawn、posix_spawnp等,方便在进程间进行通信。

(6)glibc v2.5

glibc v2.5引入了新的getaddrinfo实现,这个实现可以提高解析域名的性能,同时支持IPv6地址。此外,该版本还引入了FORTIFY_SOURCE特性,用于检测某些Buffer Overflow等安全问题。这个特性可以在编译时或者运行时进行开启。

(7)glibc v2.9

glibc v2.9引入了GNU hash表和动态符号表特性,这个特性可以提高符号查找的性能,减少了符号冲突和库的覆盖问题。此外,在这个版本中,对malloc也进行了一些优化,包括更好的对齐和更少的锁争用。

(8)glibc v2.11

在glibc v2.11中,引入了新的定时器实现,以及对ISO C95/C99/C11标准的完整支持。此外,这个版本还优化了线程库的性能,并提供了一些新的函数,如getcpu、stpcpy等。

(9)glibc v2.25

glibc v2.25是目前最新的版本,引入了AT_RANDOM指针随机化特性,用于提高程序的安全性。此外,这个版本还对库进行了一些性能优化,如增加了一些针对多线程环境的优化,并优化了一些字符串和IO函数的实现。

三、glibc版本的性能比较

在各个glibc版本中,对性能的改进也是开发者们不断追求的目标。下面我们将对各个版本的性能进行简要的对比。

(1)多线程性能

在多线程方面,glibc的性能一直是开发者们关注的重点。在早期的版本中,pthread库是主要的线程实现,但它的性能并不是很高。随着时间的推移,glibc引入了更加优秀的NPTL线程库,并逐渐优化了线程相关的函数和数据结构。

据测试,从glibc v2.2开始,性能提升了约65%-300%的范围。而从glibc v2.4开始,malloc的性能也有了很大的提升,可以达到比较理想的5-10倍的速度。

(2)字符串处理性能

在字符串处理方面,不同的glibc版本也能带来一些性能上的改进。例如,在glibc v2.8中,对字符串操作的memcpy和memset函数进行了优化,提高了大数据量复制和清零操作的效率。而在glibc v2.25中,则对字符串处理的多个函数进行了优化,如strlen、strcpy、strncpy、strcat等。

(3)IO性能

在IO方面,较早的glibc版本中,IO函数的实现有一些性能问题,如频繁的系统调用等。而在glibc v2.4及以后的版本中,IO的性能有了很大的提升,IO几乎不会阻塞其他线程的执行,从而提高了整个程序的性能。

(4)程序启动时间

除了上述的特定性能优化以外,在程序启动时间方面,glibc版本的变化也有比较明显的影响。随着版本的升级,程序启动时间有时候会变慢,但通常在后续的版本中会再次提升。

例如,在早期的glibc版本中,程序启动时间较慢,并且对于执行时共享的库,每次程序启动都要重新加载。而随着glibc v2.3的到来,程序启动时间有了很大的改进,并引入了动态符号表,以优化库的加载过程。

四、glibc版本的兼容性

对于应用程序开发者来说,glibc版本的兼容性也是一个重要的问题。在不同的Linux发行版中,glibc的版本可能有所不同。而如果我们在某个发行版中编译了一个基于glibc库的程序,在其他版本的发行版上运行时可能会出现问题。

为了解决这个问题,glibc引入了一种可兼容性的思路,称为“Application Binary Interface(ABI)兼容性”。这个兼容性规范要求在不同版本的glibc中,相同的库和程序应该保持向后兼容,而新的库和程序也应该保持向前兼容。

在具体实现时,glibc的开发者会对每个库的函数进行“符号版本化”。这样,对于新旧版本之间的兼容性,就可以根据符号版本的匹配来确定使用哪个库函数。

五、

glibc作为Linux系统的一个重要组件,提供了丰富的C语言标准库支持,并且在不同版本中不断提升其功能和性能。选择合适的glibc版本,可以帮助我们开发出更为高效、安全、可靠的Linux应用程序。

当然,在实际开发过程中,除了glibc版本以外,我们还需要考虑其他因素,如不同的Linux内核版本、不同平台架构等等。但glibc作为Linux系统中的一个重要组件,其版本的特征和兼容性问题无疑会对我们的开发过程产生一些直接的影响。

相关问题拓展阅读:

发布出去的程序,运行时总依赖glibc的版本怎么办

要点:  glibc是gnu发布的libc库,即c运行库。glibc是linux系统中更底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。由于glibc囊括了几乎所有的UNIX通行的标准,可以想见其内容包罗万象。  升级Glibc的忠告:不要在运行中的系统上安装Glibc,否则将会导致系统崩溃,至少应当将新Glibc安装到其他的单独目录,以保证不覆盖当前正在使用的Glibc。(我就无知的覆盖了,囧!)  解决方法:  赶赴机房吧,幸好我在替换前在目录/lib下保存了原来的库文件(libc-2.5.so.bak),使用Linux系统盘进入“救援模式”,将被替换的2个库文件恢复,重启系统就可以了;  系统正常启动了,就交给其他部门的同事散斗去恢复数据吧。  上面就是Linux升级Glibc时系统奔溃的解决方法的介绍了,方法很简散掘竖单,就要进入救援模式,将替换的库文件恢复回来就可以了,如果你在升级Glibc的时候不覆盖原有的Glibc就不会冲大导致系统奔溃。

哪位大神简要介绍一下Linux如何安全升级glibc?我在debian下成功编译了新版本的glibc

你可以借鉴一下gentoo的升级思路,因为gentoo都是源代码编译的

首先编译核心工具组(gcc, ld, binutils),注意使用静态编译(–disable-shared),安装到裤李悉指定的位置(–with-sysroot –with-local-prefix)

然后chroot到那个位置编译glibc并安装

然后使用新的glibc静态编译核心工具组,chroot回去,覆盖安装回原来胡乎的地方

用此工具组再次扰蠢本地编译glibc

linux glibc 版本的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux glibc 版本,Linux glibc版本详解,发布出去的程序,运行时总依赖glibc的版本怎么办,哪位大神简要介绍一下Linux如何安全升级glibc?我在debian下成功编译了新版本的glibc的信息别忘了在本站进行查找喔。


数据运维技术 » Linux glibc版本详解 (linux glibc 版本)