zoukankan      html  css  js  c++  java
  • SUSE glibc升级为2.18过程记录

    先验知识:
    1、运行时,动态库的装载依赖于ld-linux.so.6的实现,它查找共享库的顺序如下:
    (1)ld-linux.so.6在可执行的目标文件中被指定,可用readelf命令查看
    (2)ld-linux.so.6缺省在/usr/lib和lib中搜索;当glibc安装到/usr/local下时,它查找/usr/local/lib
    (3)LD_LIBRARY_PATH环境变量中所设定的路径
    (4)/etc/ld.so.conf(或/usr/local/etc/ld.so.conf)中所指定的路径,由ldconfig生成二进制的ld.so.cache中
    2、编译时,搜索库的路径顺序如下:
    (1)ld-linux.so.6由gcc的spec文件中所设定
    (2)gcc --print-search-dirs所打印出的路径,主要是libgcc_s.so等库。可以通过GCC_EXEC_PREFIX来设定
    (3)LIBRARY_PATH环境变量中所设定的路径,或编译的命令行中指定的-L/usr/local/lib 
    (2)binutils中的ld所设定的缺省搜索路径顺序,编译binutils时指定。(可以通过“ld --verbose | grep SEARCH”来查看)
    3、二进制程序的搜索路径顺序为PATH环境变量中所设定。一般/usr/local/bin高于/usr/bin
    4、编译时的头文件的搜索路径顺序,与library的查找顺序类似。一般/usr/local/include高于/usr/include

    先升级了gcc为4.8.2,然后下载2.18的源码安装,源码解压后:
    cd glibc-2.18
    mkdir build
    cd build
    ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin  
    make && make install
    需要等大概10分钟。

    如果configure时候自己指定安装目录会比较麻烦,见后面参考文章,自己就把库搞错了导致linux下所有命令都提示段错误。最后还是重新设置LD LIB变量解决的段错误恢复过来的。(Probably your LD_LIBRARY_PATH includes a dot / . and that Lib directory contains standard libraries like libc, so what ever command you issue, system picks a library from that path and something goes wrong.)

    成功后:
    [root@HY build]#  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.18
    GLIBC_PRIVATE
     

    安装过程遇到的错误解决,因为gcc 4.8.2依赖库的原因需要设置正确的LD LIB变量:

    configure: error: cannot compute suffix of object files: cannot compile

    解决办法:
    我的gmp, mpfr, mpc都是使用默认参数安装的,没指定任何参数

    ./configure
    make
    make install

    所以直接使用下面的命令设置环境变量就可以了:

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

    如果安装时指定了安装目录,使用类似下面的命令:

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/gcc-4.6.3/mpc-0.9/mpc_install/lib:/opt/gcc-4.6.3/gmp-5.0.4/gmp_install/lib

    参考:http://www.jiagoumi.com/work/811.html

    【工作】Centos6.5 升级glibc解决“libc.so.6: version GLIBC_2.14 not found”报错问题

    写在前面:

    研发发来邮件说线上有台服务器跑程序报错,信息如下:
    ./agent: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by./agent)
     

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

     
    glibc是gnu发布的libc库,即c运行库,glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。
     
    很多linux的基本命令,比如cp, rm, ll,ln等,都得依赖于它,如果操作错误或者升级失败会导致系统命令不能使用,严重的造成系统退出后无法重新进入,所以操作时候需要慎重。

    解决办法:

    1.查看系统版本和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版本,所以需要升级。
     

    2.下载软件并升级:

    # 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
     

    3.再次查看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库,这样命令就可以正常使用了。
     
  • 相关阅读:
    编写你的应用程序(二)、原生客户端模块
    编写你的应用程序(一)、应用结构
    checkpoint机制,show engine innodb status
    InnoDB关键特性,innodb_old_blocks_time,锁,内存管理,latch争用
    Innodb引擎,MySQL修改参数
    MySQL数据库体系结构
    IT行业数据库分析
    生成一个千万行的表
    范式小知识
    MySQL触发器
  • 原文地址:https://www.cnblogs.com/bonelee/p/8310389.html
Copyright © 2011-2022 走看看