我不完全理解glibc的版本控制机制。 在什么情况下开发人员决定一个函数需要一个新版本,并且该函数不再在glibc中“向后兼容”并且需要引入一个新的GLIBC_2.X版本?
对于函数的原型更改或API更改,我理解,但还有更多原因吗?
即。的fnmatch:
我正在看glibc 2.19上的readelf
输出,我看到了两个版本的fnmatch:
151: 000bff40 892 FUNC GLOBAL DEFAULT 12 fnmatch@GLIBC_2.0
152: 000bff40 892 FUNC GLOBAL DEFAULT 12 fnmatch@@GLIBC_2.2.3
但是当我看到glibc的代码时,我发现它们的功能完全相同:
versioned_symbol (libc, __fnmatch, fnmatch, GLIBC_2_2_3);
# if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_2_3)
strong_alias (__fnmatch, __fnmatch_old)
compat_symbol (libc, __fnmatch_old, fnmatch, GLIBC_2_0);
# endif
那为什么fnmatch甚至有两个版本? 开发人员还有什么其他原因可以启动函数的“新版本”?
答案 0 :(得分:2)
在ABI改变的情况下,界面也会改变,例如内部结构的一些变化,这些变化可以通过针对旧版本库编译的代码来显示。这需要新版本的符号。
默认情况下,在编译代码时,会选择当前版本。 glibc还提供了旧版本,允许用旧版glibc版本编译的二进制文件(由供应商提供)并在一台机器上运行它们(它有一个较新的glibc版本)。