7.3. 对glibc 的显著变化
现在,所有线程 API 都合并到 libc.so.6
中
在 RHEL 8 中,系统线程库 libpthread.so
是不同的库。在 RHEL 9 中,所有线程 API 都已合并到核心 C 库 libc.so.6
中。将线程移到核心 C 库可使库默认支持线程。由于线程 API 和核心 C,POSIX 以及 BSD API 都同时更新(没有不同的库),因此使用一个文件,就地升级过程也变得更加顺畅。
在链接线程应用程序时,开发人员可以继续使用 -lpthread
选项,但不再是必需的。
过去,库使用弱引用 pthread_create
或 pthread_cancel
来检测进程是否可能是多线程的。由于这个检查现在始终成功,因为 libpthread.so
现在位于核心 C 库中,所以库应该改为使用 __libc_single_threaded
符号。
libdl
库现在合并到 libc.so.6
在 RHEL 8 中,libdl
库是一个不同的库。在 RHEL 9 中,libdl
库已合并到 核心 C 库 libc.so.6
中。这意味着,插入 dlsym
函数现在更加困难。需要控制符号解析如何工作的应用程序应该切换到审核程序(LD_AUDIT
)接口。
dns
和 files
的 名字服务切换服务插件现在合并到 libc.so.6
在 RHEL 8 中,为用户和组群身份管理 API 提供数据的files
和 dns
的名字服务切换(NSS)服务是不同的插件。在 RHEL 9 中,插件已合并到核心 C 库 libc.so.6
中。移动 files
和 dns
服务提供程序确保需要跨挂载命名空间边界(例如,输入一个容器)应用程序可以这样做,知道 NSS files
和 dns
访问服务总是在进程启动时被加载。
调用依赖于引用 files
或 dns
的 nsswitch.conf
的用户和组 API 时,开发人员可以预期这些服务始终存在,并提供底层服务数据。