跳转至

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 或者更高版本,所以需要升级或者额外安装。

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

常规的安装方法如下:

$ mkdir ~/glibc_install; cd ~/glibc_install
$ wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz
$ tar zxvf glibc-2.14.tar.gz
$ cd glibc-2.14
$ mkdir build
$ cd build
$ ../configure --prefix=/opt/glibc-2.14
$ make -j4
$ sudo make install
$ export LD_LIBRARY_PATH="/opt/glibc-2.14/lib:$LD_LIBRARY_PATH"

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

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

使用

Segmentation fault

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

/path/to/newglibc/lib/ld-linux-x86-64.so.2 /path/to/your_app

如:
/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 的讨论可以参考:

Multiple glibc libraries on a single host

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

找不到动态链接库?

Please Wait… | Cloudflare

参考资料

  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 技术发表平台