使用ltp编译出来的cws_cmdline,cp到其他机器上执行报错:/lib64/libc.so.6: version `GLIBC_2.14′ not found

这主要是由于编译环境的glibc的版本高于运行时的glibc版本导致。

解决办法:升级glibc

具体参考:

http://qinghua.blog.51cto.com/202629/1706585

为防止链接失效,黏贴如下:

在系统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_

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

rpm -qa |grep glibc

1

2

3

4

5

6

7

8

# 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

3.可以看到最高只支持2.12版本,所以考虑编译解决这个问题

1). 到官网http://www.gnu.org/software/libc/ 或FTPhttp://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-install

cd/opt/glibc-2.14-install

4). 新建安装目录/opt/glibc-2.14-build

mkdir/opt/glibc-2.14-build

并运行configure配置,make && sudo make install

cd/opt/glibc-2.14-install目录下,执行

/opt/glibc-2.14/configure –prefix=/opt/glibc-2.14-build/

make -j4

make install

4. 临时修改环境变量

exportLD_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

1

2

3

4

5

6

7

8

9

10

11

[root@localhost lib]# objdump -p libalgrms.so

libalgrms.so:fileformatelf64-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



然后查看当前app引用了GLIBC_2.14中哪些函数

nm libalgrms.so | grep GLIBC_2.14

1

2

# nm libalgrms.so | grep GLIBC_2.14

U memcpy@@GLIBC_2.14


也可以使用 objdump 查看app动态引用符号表.

objdump -T libalgrms.so | grep GLIBC_2.14

[root@localhost lib]# objdump -T libalgrms.so | grep GLIBC_2.14
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.14 memcpy


上例显示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

.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 onlyin

the static library,so try that secondarily. */

OUTPUT_FORMAT(elf64-x86-64)

GROUP (.so.6/usr/lib64/libc_nonshared.a AS_NEEDED (/lib64/ld-linux-x86-64.so.2 ) )

# file /lib64/libc.so.6

.so.6: symbolic link to `libc-2.16.so'



获取memcpy版本信息.

1

2

3

4

5

# nm /lib64/libc-2.16.so |grep memcpy

...

000000000008a6d0 i memcpy@@GLIBC_2.14

0000000000084ab0 i memcpy@GLIBC_2.2.5

...

可以看出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信息.

1

2

3

4

5

6

7

8

9

#objdump -p app

0x0d696913 0x00 04 GLIBC_2.3

0x09691a75 0x00 02 GLIBC_2.2.5

发现当前版本需求已不再需要glibc 2.14支持.

1

2

# objdump -T app |grep memcpy

0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 memcpy

memcpy已完全修改为Glibc 2.2.5支持.

至此完美解决. 再次运行一切完美

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


linux下开机自启: 在/etc/init.d目录下新建文件elasticsearch 并敲入shell脚本: 注意, 前两行必须填写,且要注释掉。 第一行为shell前行代码,目的告诉系统使用shell。 第二行分别代表运行级别、启动优先权、关闭优先权,且后面添加开机服务会用到。 shell脚本
1、因为在centos7中/etc/rc.d/rc.local的权限被降低了,所以需要赋予其可执行权 chmod +x /etc/rc.d/rc.local 2、赋予脚本可执行权限假设/usr/local/script/autostart.sh是你的脚本路径,给予执行权限 chmod +x /usr
最简单的查看方法可以使用ls -ll、ls-lh命令进行查看,当使用ls -ll,会显示成字节大小,而ls- lh会以KB、MB等为单位进行显示,这样比较直观一些。 通过命令du -h –max-depth=1 *,可以查看当前目录下各文件、文件夹的大小,这个比较实用。 查询当前目录总大小可以使用d
ASP.NET Core应用程序发布linux在shell中运行是正常的。可一但shell关闭网站也就关闭了,所以要配置守护进程, 用的是Supervisor,本文主要记录配置的过程和过程遇到的问题 安装Supervisor 1 yum install python-setuptools
设置时区(CentOS 7) 先执行命令timedatectl status|grep 'Time zone'查看当前时区,如果不是时区(Asia/Shanghai),则需要先设置为中国时区,否则时区不同会存在时差。 #已经是Asia/Shanghai,则无需设置 [root@xia
vim /etc/sysconfig/network-scripts/ifcfg-eth0 BOOTPROTO="static" ONBOOT=yes IPADDR=192.168.8.106 NETMASK=255.255.252.0 GATEWAY=192.168.
一、安装gcc依赖 由于 redis 是用 C 语言开发,安装之前必先确认是否安装 gcc 环境(gcc -v),如果没有安装,执行以下命令进行安装 [root@localhost local]# yum install -y gcc 二、下载并解压安装包 [root@localhost local
第一步 On CentOS/RHEL 6.*: $ sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el6/x86_64/nux-dextop-release-0-2.el6.nux.noarch.rpm On CentOS/RHEL 7: $
/// <summary> /// 取小写文件名后缀 /// </summary> /// <param name="name">文件名</param> /// <returns>返回小写后缀,不带“.”</ret
which nohup .bash_profile中并source加载 如果没有就安装吧 yum provides */nohup nohup npm run start & nohup ./kibana &
1.1 MySQL安装 1.1.1 下载wget命令 yum -y install wget 1.1.2 在线下载mysql安装包 wget https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm 1.1.3 安装My
重启 reboot shutdown -r now init 6 关闭 init 0 shutdown -h now shutdown -h 20:25 #8点25关机查看内存 free CPU利用率 top 日期 date 设置时间 date 033017002015 #月日时间年 日历 cal
1、firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status firewalld 开机禁用 : systemctl disable firewalld 开机启用 :
1 下载并安装MySQL官方的 Yum Repository wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 使用上面的命令就直接下载了安装用的Yum Repository,大概
CentOS6.x CentOS6中转用Upstrat代替以前的init.d/rcX.d的线性启动方式。 一、相关命令 通过initctl help可以查看相关命令 [root@localhost ~]# initctl help Job commands: start Start job. sto
1、使用命令:df -lk 找到已满磁盘 2、使用命令:du --max-depth=1 -h 查找大文件,删除
ifconfig:查看网卡信息 网卡配置文件位置: /etc/sysconfig/network-scripts/文件夹 nmtui:配置网卡 netstat -tlunp:查看端口信息 端口信息存储位置: /etc/services文件 route:查看路由信息 wget:下载网路文件,例如 wg
ps -ef:查看所有进程, ps -ef |grap firewalld 查看与firewalld相关的进程 which :查看进程:which firewalld kill 进程id:杀掉进程 kill 640,强制杀:kill -9 640 man:查看帮助,例如 man ps 查看
useradd:添加用户 useradd abc,默认添加一个abc组 vipw:查看系统中用户 groupadd:添加组groupadd ccna vigr:查看系统中的组 gpasswd:将用户abc添加到ccna组 gpasswd -a abc ccna groups abc:查看用户abc属