1200px-Linux_API.svg.png

前言

如果你不太了解 glibc,请不要随便升级,请不要随便升级,请不要随便升级!重要的事情说三遍!!!

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

由于 Glibc 是一个比较底层的依赖库,为了 CentOS 6 安全,你可能不太想冒着风险直接升级,特别是对于一些运行这其他业务的服务器。前车之鉴就在这里!

一次”胆战心惊”的真实集群运维经历

安装

CentOS 6.5,最高支持 glibc 的版本为2.12,而有些程序要 2.14 或者更高版本,所以需要升级或者额外安装。

  1. $ strings /lib64/libc.so.6 |grep GLIBC_
  2. GLIBC_2.2.5
  3. GLIBC_2.2.6
  4. GLIBC_2.3
  5. GLIBC_2.3.2
  6. GLIBC_2.3.3
  7. GLIBC_2.3.4
  8. GLIBC_2.4
  9. GLIBC_2.5
  10. GLIBC_2.6
  11. GLIBC_2.7
  12. GLIBC_2.8
  13. GLIBC_2.9
  14. GLIBC_2.10
  15. GLIBC_2.11
  16. GLIBC_2.12
  17. GLIBC_2.13
  18. GLIBC_2.14
  19. GLIBC_PRIVATE

常规的安装方法如下:

  1. $ mkdir ~/glibc_install; cd ~/glibc_install
  2. $ wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz
  3. $ tar zxvf glibc-2.14.tar.gz
  4. $ cd glibc-2.14
  5. $ mkdir build
  6. $ cd build
  7. $ ../configure --prefix=/opt/glibc-2.14
  8. $ make -j4
  9. $ sudo make install
  10. $ export LD_LIBRARY_PATH="/opt/glibc-2.14/lib:$LD_LIBRARY_PATH"

安装过程中如果出现以下 LD_LIBRARY_PATH shouldn’t contain the current directory when building glibc 提示,可以按照下面的方法处理:

  1. configure: WARNING:
  2. *** These auxiliary programs are missing or incompatible versions: makeinfo
  3. *** some features will be disabled.
  4. *** Check the INSTALL file for required versions.
  5. checking LD_LIBRARY_PATH variable... contains current directory
  6. configure: error:
  7. *** LD_LIBRARY_PATH shouldn't contain the current directory when
  8. *** building glibc. Please change the environment variable
  9. *** and run configure again.
  1. 先 echo $LD_LIBRARY_PATH 先看一下结果;
  2. 确保结果中不包含了 “:” 的结尾!
    1. unset LD_LIBRARY_PATH
    2. export LD_LIBRARY_PATH=/path/to/prefix/dir/lib

使用

Segmentation fault

很多人喜欢在手动安装完以后,通过设置 LD_LIBRARY_PATH 环境,然后进行使用,但是这样的用法很容易会导致 Segmentation fault (core dumped) 的异常。折中的解决方法如下:

  1. /path/to/newglibc/lib/ld-linux-x86-64.so.2 /path/to/your_app
  2. 如:
  3. /path/to/newglibc/lib/ld-linux-x86-64.so.2 /bin/ls

image.png

PatchELF

在同一台服务器上安装并使用多个版本的 GLIBC,StackOverflow 上很多人都在推荐使用 PatchELF 这个工具,PatchELF 是一个用于修改现有 ELF 可执行文件和库的简单实用程序。

ELF: 可执行与可链接格式(Executable and Linkable Format),常被称为 ELF 格式。

StackOverflow 上关于在同一台服务器上安装并使用多个版本的 GLIBC 的讨论可以参考:

PatchELF 是一个开源的工具,GitHub 链接:https://github.com/NixOS/patchelf,用法可以参考:

参考资料

  1. Haidar Ali,《Multiple glibc on a Single Linux Machine》,Baeldung on Linux
  2. 名本无名,《找不到动态链接库?》,知乎专栏
  3. Unix & Linux,《如何在 CentOS 6.5 中将 glibc 更新到 2.14》,QA Stack
  4. 試毅-思伟,《Linux 下安装 GLIBC_2.15》,云+社区 - 腾讯云
  5. caosiyang,《SCL 基本用法》,一个单板滑雪爱好者的编程笔记
  6. zzhongcy,《CentOS/RHEL 开发环境之 devtoolset》,CSDN博客 - 专业IT技术发表平台