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中的库函数,因此出错。