先验知识:
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库,这样命令就可以正常使用了。
 

SUSE glibc升级为2.18过程记录的更多相关文章

  1. 升级vue全家桶过程记录

    背景 如果你使用了element-ui的el-tabs组件,并且想要单独升级element-ui至2.10.0,你会发现,使用了el-tabs组件的页面只要打开就卡死.原因是element-ui~2. ...

  2. iPad 2升级iOS 9的过程记录

    有一台老旧的iPad2,iOS版本还是5.1.1,现在好多软件都无法安装了. 决定升级到最新的操作系统,中间的过程,遇到的问题和解决办法如下: 据说升级到iOS 9以后就不好越狱了,不过我也就是用用一 ...

  3. Tableau Server 8.0 升级到 8.3 过程记录

    一.使用账号(管理员权限),安装文件复制到服务器 二.检查维护状态 如果维护状态过期,更新到新版本会变成未授权. 先进Manage Product Keys刷新一下维护日期(其实不刷新也无所谓.到时候 ...

  4. CentOS下升级python2.7.10过程记录

    1.准备好一份Python2.7.10源码包,下载地址: http://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz 2.安装Python2.7 ...

  5. tflearn anaconda 安装过程记录

    准备工作:gcc升级为4.8.2glibc升级为2.18 /opt/xxx/xxx/components/ficlient/bigdata_env 里加入:export LD_LIBRARY_PATH ...

  6. 升级Windows 10 正式版过程记录与经验

    升级Windows 10 正式版过程记录与经验 [多图预警]共50张,约4.6MB 系统概要: 预装Windows 8.1中文版 64位 C盘Users 文件夹已经挪动到D盘,并在原处建立了符号链接. ...

  7. 我在Suse 11 Sp3上使用anaconda安装TensorFlow的过程记录

    我在Suse 11 Sp3上使用anaconda安装TensorFlow的过程记录 准备安装包: gcc48 glibc--SP4-DVD-x86_64-GM-DVD1.iso tensorflow_ ...

  8. 升级到 ExtJS 5的过程记录

    升级到 ExtJS 5的过程记录   最近为公司的一个项目创建了一个 ExtJS 5 的分支,顺便记录一下升级到 ExtJS 5 所遇到的问题以及填掉的坑.由于 Sencha Cmd 的 sencha ...

  9. Kubernetes 升级过程记录:从 1.17.0 升级至最新版 1.20.2

    本文记录的是将 kubernetes 集群从 1.17.0 升级至最新版 1.20.2 的实际操作步骤,由于 1.17.0 无法直接升级到 1.20.2,需要进行2次过滤升级,1.17.0 -> ...

随机推荐

  1. spring框架搭建(一)

    spring介绍 spring是一个轻量级控制反转(IOC)和面向切面(AOP)的容器框架,它主要是为了解决企业应用开发复杂性而诞生的. 简单来说spring是一个一站式轻量级开源框架. IOC:In ...

  2. HTML5 postMessage 和 localStorage 实现窗口间通信

    LocalStorage(不能跨域) 基本思想:通过localStorage的标准事件storage来实现跨页面通信,即页面A通过写入特定数据触发页面B的storage事件,页面B响应之后再写入数据通 ...

  3. P1146 硬币翻转

    题目描述 在桌面上有一排硬币,共N枚,每一枚硬币均为正面朝上.现在要把所有的硬币翻转成反面朝上,规则是每次可翻转任意N-1枚硬币(正面向上的被翻转为反面向上,反之亦然).求一个最短的操作序列(将每次翻 ...

  4. Android 侦听应用(Package)变化的方法侦听广播

    应用的状态变化,包括安装.卸载.更新,是android系统上重要的事件.如何侦听到?有两种方法,一是通过侦听广播,一是实现PackageMonitor. 侦听广播   当Package状态发生变化时, ...

  5. 深入浅出java多态

    所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个 ...

  6. openstack--memecache

    一.缓存系统 静态web页面: 1.工作流程: 在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Reques ...

  7. Clocksource tsc unstable

    内核在启动过程中会根据既定的优先级选择时钟源.优先级的排序根据时钟的精度与访问速度. 其中CPU中的TSC寄存器是精度最高(与CPU最高主频等同),访问速度最快(只需一条指令,一个时钟周期)的时钟源, ...

  8. 类的定义与实例化、构造函数和初始化表(day04)

    十三 类的定义与实例化 类的一般形式 class/struct 类名:继承表{ 访问控制限定符: 类名(形参表):初始化表{}//构造函数 ~类名(void){}//析构函数 返回类型 函数名(形参表 ...

  9. jQuery cxSelect 联动下拉菜单

    插件简介 cxSelect 是基于 jQuery 的多级联动菜单插件,适用于省市.商品分类等联动菜单. 列表数据通过 AJAX 获取,也可以自定义,数据内容使用 JSON 格式. 同时兼容 Zepto ...

  10. Junit在SSH中的集成测试

    测试Spring容器 在Junit的测试类中,继承AbstractJUnit4SpringContextTests就可以进行Spring容器测试, 例如下面测试用例, @RunWith(SpringJ ...