undefined reference to `memcpy@GLIBC_2.14'

1. undefined reference to `memcpy@GLIBC_2.14'
原因: 程序要调用XXX.so,而XXX.so的编译环境比当前系统版本要高。
查看现有系统的GLIBC库版本:  strings /lib64/libc.so.6 |grep GLIBC

2. glibc升级 从2.12 到 2.14
tar -xzvf glibc-2.14. tar .gz
mkdir build // 在glibc-2.14目录下建立build文件夹
cd build // 进入build目录
../configure --prefix=/opt/glibc-2.14 // 配置glibc并设置当前glibc-2.14安装目录
make && make install // 编译安装glibc-2.14库
glibc软链
安装完成后,建立指向glibc-2.14的软链接, 执行如下命令:
rm -rf /lib64/libc.so.6 // 先删除先前的libc.so.6的软链接
ln -s /opt/glibc-2.14/lib/libc-2.14.so /lib64/libc.so.6
注意
删除libc.so.6之后可能导致系统命令不可用的情况, 可使用如下方法解决:
LD_PRELOAD=/opt/glibc-2.14/lib/libc-2.14.so ln -s /opt/glibc-2.14/lib/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 
此时查看系统glibc版本如下图所示: strings /lib64/libc.so.6 |grep GLIBC

    【注】:LD_PRELOAD是一个环境变量,用于预先装载一些共享库或目标文件,其装载优先级最高,更详细的信息可查看资料,如博客:https://blog.csdn.net/ieearth/article/details/49952047

3. 在编译环境make生成可执行文件,拷贝到测试环境竟然没有被调用,可能的原因:在可执行文件被执行之前就已经出现问题,所以很有可能是glibc的问题
例如:
我将登录模块WebLoginExt.exe拷贝到测试环境上面时,模块入口处的登录信息都没有被打印,说明该exe文件没有被执行,首先检查该文件的权限,发现确实具有可执行权限。经过gdb调试才找到问题出处,原来是编译环境和测试环境的glibc不匹配的问题。因为我在前一天将开发环境的glibc版本从2.12升级到2.14,而测试环境的glibc版本仍然是2.12,执行WebLoginExt.exe时,动态链接需要调用glibc2.14中的库函数,因此出错。

猜你喜欢

转载自blog.csdn.net/g1269420003/article/details/80678162
今日推荐