升级glibc到2.17及出现的问题

开发要求libc库最低是2.17,但是我这个是2.12的,当然不能用了,还好,gcc 4.8.5的,直接用来编译升级就好了。

开始前

执行程序的时候报了一个错:

/lib64/libc.so.6 version GLIBC_2.14 not found

很明显链接的库不是2.14的。根据 tlpi上所说的,动态加载库有三个名字比较重要。文件名,库名,链接器名,而且用ldconfig 来进行管理与更新。如:

  • realname : libmath.so.1.3 文件名
  • soname : libmath.so.1 库名
  • linkername : libmath.so 链接器编译的时候链接的名称。

ldconfig命令干的活,就是在默认目录和我们制定的库目录内寻找所有的库文件,然后根据文件名来更新最新的连接。比如吧,看一下我们需要的 libc.so.6现在的指向。

ll /lib64/libc.so.6
lrwxrwxrwx 1 root root 12 Jul  9 22:30 /lib64/libc.so.6 -> libc-2.12.so

瞧,是个符号链接文件吧。我们就是要把后面的变成2.18来。

升级

升级非常的简单:

wget http://ftp.gnu.org/gnu/glibc/glibc-2.17.tar.gz
tar –zxvf glibc-2.17.tar.gz
cd glibc-2.17
mkdir build
cd build
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
make –j4
make install     #这一步切记。就算提示error 先不要慌 接着往下走

安装后就会发现, 这一步 不一定大家都会顺利实现,请看下面遇到的问题:

ll /lib64/libc.so.6
lrwxrwxrwx 1 root root 12 Jul  9 22:30 /lib64/libc.so.6 -> libc-2.18.so

遇到的问题

我开始没有执行 make install,然后想着不安装,自己编译了受手动制定链接定制就行了。

果断的一个 rm -f /lib64/libc.so.6,然后,结果就坑了。所有的命令都执行不了,因为没有了这个共享库了,很多命令都是基于这个库的。型号,万能的谷歌。

让我先把命令找回来。想到这个动态库本来就是链接到一个真实文件的,那如果我们要指定加载的库位置,不需要这个链不也是可以的,确实是这样的。我们可以指定运行时加载库的加载库

LD_PRELOAD=/lib64/libc-2.12.so ln -s /lib64/libc-2.12.so /lib64/libc.so.6

这样就恢复原状,后面执行 make install就OK了

在make install时报错error

#有些人会在make install后出现error。这儿error我没去细究,此时可以查看一下系统此时的GLIBC版本,参考一开始的做法。如果版本未升级,我们只能手动安装一下:
首先make是成功了,那么我们会发现build目录下编译出了一个新的libc.so.6 (/glibc-build-2.17/libc.so.6, 我们会发现这实际上也是一个软连接,真实的lib文件是libc.so

make: *** [install] Error 2     这就是上面的报错 
然后:
[root@xsl003 build]# pwd
/lib64/glibc-2.17/build
[root@xsl003 build]# ll /lib64/lobc.so.6
ls: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /lib64/librt.so.1)
ls: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /lib64/libpthread.so.0)
[root@xsl003 build]# ll libc.so
libc.so    libc.so.6  
这里的libc.so即为真实的lib文件
接着:
[root@xsl003 lib64]# LD_PRELOAD=/lib64/glibc-2.17/build/libc.so  ln -sf /lib64/libc-2.17.so /lib64/libc.so.6
[root@xsl003 lib64]# 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_2.15
GLIBC_2.16
GLIBC_2.17
GLIBC_PRIVATE
说明连接安装成功