CentOS “/lib64/libc.so.6: version `GLIBC_2.14′ not found”系统glibc版本太低
2015-10-26 23:32
946 查看
在系统CentOS release 6.4 (Final)x86_64上操作1.试图运行程序提示”libc.so.6: version `GLIBC_2.14′ not found”,原因是系统的glibc版本太低,软件编译时使用了较高版本的glibc引起的. 2.查看系统glibc支持的版本strings /lib64/libc.so.6|grep GLIBC_
rpm -qa |grep glibc
3.可以看到最高只支持2.12版本,所以考虑编译解决这个问题1). 到官网 http://www.gnu.org/software/libc/或FTP http://ftp.gnu.org/gnu/glibc/ (推荐)下载最新版本,这里下载了glibc-2.14.tar.xz 版本,解压到任意目录准备编译2).这里解压到 /opt/glibc-2.14 3).新建目录 /opt/glibc-2.14-install ,并cd进入此目录:mkdir/opt/glibc-2.14-installcd /opt/glibc-2.14-install 4). 新建安装目录 /opt/glibc-2.14-buildmkdir /opt/glibc-2.14-build并运行configure配置,make && sudomake install在 cd /opt/glibc-2.14-install 目录下,执行 /opt/glibc-2.14/configure –prefix=/opt/glibc-2.14-build/make -j4make install 4. 临时修改环境变量export LD_LIBRARY_PATH=/opt/glibc-2.14-build/lib:$LD_LIBRARY_PATH注意:glibc-2.14-build 是安装目录 ———————–version `GLIBC_2.14′ not found 解决方法一般出现类似次问题是当前运行系统Glibc版本低于编译环境Glibc版本造成Glibc版本兼容性造成的.
通常可以使用-static链接成静态程序即可解决.
不过经过google大神发现还有另外一种方法可以在使用动态库的环境下规避此类问题.首先查看APP Glibc 兼容性.看当前app使用了哪些Glibc版本.objdump -p libalgrms.so
然后查看当前app引用了GLIBC_2.14中哪些函数nm libalgrms.so | grep GLIBC_2.14
也可以使用 objdump 查看app动态引用符号表.objdump -T libalgrms.so | grep GLIBC_2.14[root@localhost lib]# objdump -T libalgrms.so | grep GLIBC_2.14
0000000000000000DF *UND*0000000000000000GLIBC_2.14memcpy
上例显示app引用 2.14 版本中的memcpy函数.
下面将用到 gcc 的一个特性实际上是ld的特性.可以将引用符号绑定到一个特定版本.只需在.c文件中写入类似代码.
__asm__(“.symver original_foo,foo@VERS_1.1″);
即可.
查找当前系统glibc版本中memcpy的各个版本.
获取libc.so实际路径.
获取memcpy版本信息.
可以看出memcpy最低版本是(“@GLIBC_2.2.5″)2.2.5,而默认使用版本是2.14(“@@GLIBC_2.14″) 这里我们只要将 glibc 2.14 版本memcpy降到glibc 2.2.5. 在源代码写入以下代码
__asm__(“.symver memcpy,memcpy@GLIBC_2.2.5″);
重新编译.再次查看app信息.
发现当前版本需求已不再需要glibc 2.14支持.
memcpy已完全修改为Glibc 2.2.5支持.
至此完美解决. 再次运行一切完美
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [root@localhost work] # 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 |
1 2 3 4 5 6 7 8 | [root@localhost work] # rpm -qa |grep glibc compat-glibc-headers-2.5-46.2.x86_64 glibc-common-2.12-1.107.el6.x86_64 glibc-devel-2.12-1.107.el6.x86_64 glibc-2.12-1.107.el6.i686 compat-glibc-2.5-46.2.x86_64 glibc-2.12-1.107.el6.x86_64 glibc-headers-2.12-1.107.el6.x86_64 |
通常可以使用-static链接成静态程序即可解决.
不过经过google大神发现还有另外一种方法可以在使用动态库的环境下规避此类问题.首先查看APP Glibc 兼容性.看当前app使用了哪些Glibc版本.objdump -p libalgrms.so
1 2 3 4 5 6 7 8 9 10 11 | [root@localhost lib] # objdump -p libalgrms.so libalgrms.so: file format elf64-x86-64 ..... Version References: required from libc.so.6: 0x06969194 0x00 04 GLIBC_2.14 0x0d696914 0x00 03 GLIBC_2.4 0x09691a75 0x00 02 GLIBC_2.2.5 |
1 2 | [root@localhost lib] # nm libalgrms.so | grep GLIBC_2.14 U memcpy@@GLIBC_2.14 |
0000000000000000DF *UND*0000000000000000GLIBC_2.14memcpy
上例显示app引用 2.14 版本中的memcpy函数.
下面将用到 gcc 的一个特性实际上是ld的特性.可以将引用符号绑定到一个特定版本.只需在.c文件中写入类似代码.
__asm__(“.symver original_foo,foo@VERS_1.1″);
即可.
查找当前系统glibc版本中memcpy的各个版本.
获取libc.so实际路径.
1 2 3 4 5 6 7 8 9 10 11 12 | # gcc --print-file-name=libc.so /usr/lib/gcc/x86_64-unknown-linux-gnu/4 .7.1/../../../.. /lib64/libc .so # file /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../lib64/libc.so /usr/lib/gcc/x86_64-unknown-linux-gnu/4 .7.1/../../../.. /lib64/libc .so: ASCII text - bash -4.1 # cat /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../lib64/libc.so /* GNU ld script Use the shared library, but some functions are only in the static library, so try that secondarily.*/ OUTPUT_FORMAT(elf64-x86-64) GROUP ( /lib64/libc .so.6 /usr/lib64/libc_nonshared .aAS_NEEDED ( /lib64/ld-linux-x86-64 .so.2 ) ) - bash -4.1 # file /lib64/libc.so.6 /lib64/libc .so.6: symbolic link to `libc-2.16.so' |
1 2 3 4 5 | - bash -4.1 # nm /lib64/libc-2.16.so |grep memcpy ... 000000000008a6d0 i memcpy@@GLIBC_2.14 0000000000084ab0 i memcpy@GLIBC_2.2.5 ... |
__asm__(“.symver memcpy,memcpy@GLIBC_2.2.5″);
重新编译.再次查看app信息.
1 2 3 4 5 6 7 8 9 | #objdump -p app ... Version References: required from libc.so.6: 0x0d696913 0x00 04 GLIBC_2.3 0x0d696914 0x00 03 GLIBC_2.4 0x09691a75 0x00 02 GLIBC_2.2.5 |
1 2 | # objdump -T app |grep memcpy 0000000000000000DF *UND*0000000000000000GLIBC_2.2.5 memcpy |
至此完美解决. 再次运行一切完美
相关文章推荐
- df 命令的使用(centos测试ok,mac参数可能不一样)
- Centos安装gnome主菜单编辑器无
- Centos安装gnome主菜单编辑器无
- Linux修改系统主机名
- Linux(Ubuntu)下如何安装JDK
- 20135316王剑桥 linux第六周课实验笔记
- Linux extundelete命令
- CentOS6.5系统挂载NTFS分区的硬盘
- Linux_RHEL7_YUM
- ARM9开发板FL2440移植Linux-3.0内核————触摸屏的移植
- 脚 本 练 习 (一)
- Linux 文件读写笔记
- 关于linux-Centos 7下mysql 5.7.9的rpm包的安装方式
- 系统管理员必学的30个Linux实用命令
- Linux 下报错:A Java RunTime Environment (JRE) or Java Development Kit (JDK) must解决方案
- Linux下安装Mysql
- Linux下Vi/Vim的使用方法
- linux运维之iptables基础及配置实例
- linux kernel调试相关
- Linux有关文件内容