同事说线上有台服务器跑程序报错,信息如下:./agent: /lib64/libc.so.6: version `GLIBC_2.14’ not found

    从上面报错可以看出,程序运行时候,没有找到“GLIBC_2.14”这个版本库,而默认的Centos6.5 glibc版本最高为2.12, 所以需要更新系统glibc库。

    glibc是gnu发布的libc库,即c运行库,glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。

    很多linux的基本命令,比如cp, rm, ll,ln等,都得依赖于它,如果操作错误或者升级失败会导致系统命令不能使用,严重的造成系统退出后无法重新进入,所以操作时候需要慎重。

    看系统版本和glibc库版本

    cat /etc/redhat-release
    CentOS release 6.5 (Final)

    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_PRIVATE

    由上面的信息可以看出系统是CentOS 6.5,最高支持glibc的版本为2.12,而研发程序要2.14版本,所以需要升级。

    下载软件并升级:

    wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz
    wget http://ftp.gnu.org/gnu/glibc/glibc-ports-2.14.tar.gz
    tar -xvf glibc-2.14.tar.gz
    tar -xvf glibc-ports-2.14.tar.gz
    mv glibc-ports-2.14 glibc-2.14/ports
    mkdir glibc-build-2.14
    cd glibc-build-2.14/
    ../glibc-2.14/configure —prefix=/usr —disable-profile —enable-add-ons —with-headers=/usr/include —with-binutils=/usr/bin
    make

    注意:当make成功后,会在当前glibc-build-2.14目录下生成一个新的libc.so.6的软连接,指向的是本目录下的libc.so文件,如下所示:

    ll glibc-build-2.14/libc.so.6
    glibc-build-2.14/libc.so.6 -> libc.so

    可以将上面的libc.so文件直接拷贝到/lib64下面改名为libc-2.14.so,删除原来的libc.so.6软连接,建立新的连接即可使用,但是此处有一个大坑,后面会介绍,此处还是按照正常流程安装。

    继续完成后续的安装:

    make install
    以上完成不报错的话,查看库文件,发现/lib64/libc.so.6软链接指向了2.14版本

    ll /lib64/libc.so.6
    /lib64/libc.so.6 -> /lib64/libc-2.14.so

    再次查看glibc支持的版本:

    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

    可以看到glibc支持的版本已经到2.14,再次执行程序就不会报错了。

    其他知识点:

    有些安装方法是编译时候指定的目录不是/usr,而是通过建立软链指向新的libc-2.14.so版本,在此过程中需要删除原来连接,建立新的软连接,但是此处有一个大坑,就是当你删除libc.so.6之后会导致系统命令不可用,如下在测试机中演示的错误过程:

    rm -rf /lib64/libc.so.6

    接下来当你建立新的软链接时候,会发现ln命令不能用了。

    ln -s /lib64/libc-2.14.so /lib64/libc.so.6
    ln: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory

    当出现上面的状况时候,可以使用以下方法解决(假设libc-2.14.so已经拷贝到/lib64/目录下):

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

    当然如果升级失败,还可以使用下面命令还原至系统升级前的版本libc-2.12.so:

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

    “LD_PRELOAD”是一个环境变量,定义在程序运行前优先加载的动态链接库,本处作用就是在执行后面的ln命令时,指定使用的glibc库,这样命令就可以正常使用了。
    ————————————————
    版权声明:本文为CSDN博主「xiong1250」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/xiong1250/article/details/90730609