注意:可能是个人水平问题,最后系统还是让我给弄挂了,我这是在虚拟机中的系统,挂了无大碍,只是一直没有找到正确的方法,有些愁苦,就这么地吧,以后再说了。下面只是自己当时的一些记录,仅供参考。
在CentOS6.5(x86_64)中安装Perl时出错,提示内容是:perl/bin/perl: /lib64/libc.so.6: version `GLIBC_2.14′ not found (required by perl/bin/perl)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 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 |
果然是没有2.14啊。
最新版本的Perl运行要求glibc最低版本是2.14的,所以准备安装glibc2.14,先了解一下glibc是干什么的?
glibc是gnu发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现…总的来说,不说运行在linux上的一些应用,或者你之前部署过的产品,就是很多linux的基本命令,比如cp, rm, ll之类,都得依赖于它。
有点冒汗,所以,不要装过高的版本,本身安装glibc就是有风险的,够用就行,那就装glibc2.14。
Glibc全部版本 http://ftp.gnu.org/gnu/glibc/
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz # tar -zxvf glibc-2.14.tar.gz # cd ./glibc-2.14 # ls Makefile ifunc-defines.h.d locale shlib.lds Versions.all inet locale-defines.h signal Versions.def.v intl locale-defines.h.d socket Versions.def.v.i io localedata soversions.i Versions.tmp ld.map login soversions.mk Versions.v libBrokenLocale.map lowlevelbarrier.h stamp.o Versions.v.i libanl.map lowlevelbarrier.h.d stamp.oS abi-versions.h libc-abis.h lowlevelcond.h stamp.os argp libc-abis.stamp lowlevelcond.h.d stdio-common assert libc.a lowlevelrobustlock.h stdlib bits libc.map lowlevelrobustlock.h.d streams catgets libc.so lowlevelrwlock.h string config.h libc.so.6 lowlevelrwlock.h.d structsem.h config.log libc_nonshared.a malloc structsem.h.d config.make libc_pic.a manual sunrpc config.status libc_pic.os math sysd-rules conform libcidn.map misc sysd-sorted crypt libcrypt.map nis sysd-syscalls csu libdl.map nptl sysd-versions ctype libidn nptl_db sysvipc debug libio nscd tcb-offsets.h dirent libm.map nss tcb-offsets.h.d dlfcn libnsl.map po termios dummy.c libnss_compat.map posix testrun.sh dummy.o libnss_dns.map pthread-errnos.h time dummy.o.dt libnss_files.map pthread-errnos.h.d timezone elf libnss_hesiod.map pthread-pi-defines.h tls.make format.lds libnss_nis.map pthread-pi-defines.h.d tlsdesc.h gmon libnss_nisplus.map pwd tlsdesc.h.d gnu libpthread.map resolv ucontext_i.h gnulib libresolv.map resource ucontext_i.h.d grp librt.map rt unwindbuf.h gshadow libthread_db.map s-proto-bp.d unwindbuf.h.d hesiod libutil.map setjmp wcsmbs iconv link-defines.h shadow wctype iconvdata link-defines.h.d shlib-versions.v ifunc-defines.h linkobj shlib-versions.v.i # mkdir build # cd ./build # ../configure --prefix=/var/opt/glibc-2.14 # make -j4 # make install |
抽根烟,等一会…
安装完成。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# strings libc.so | 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出现了,但/lib64/libc.so.6还是指向2.12这个旧版本,如下:
0 1 |
# ls -l /lib64/libc.so.6 lrwxrwxrwx. 1 root root 12 Jan 11 2017 /lib64/libc.so.6 -> libc-2.12.so |
做个带版本号的软连接放在lib64文件夹下
0 |
# ln -s /var/opt/glibc-2.14/lib/libc-2.14.so /lib64/libc-2.14.so |
备份一个libc.so.6文件为libc2.so.6,可能会有用的,如果安装成功就删除这个备份。
0 |
# cp -rf /lib64/libc.so.6 /lib64/libc2.so.6 |
先删除/lib64/libc.so.6文件,在删除前服务器或者是VM能拍快照就拍一张,出问题了可以回滚。
0 |
# rm -rf /lib64/libc.so.6 |
前面加上临时环境变量,再做软件连接。这个软连接的意思就是使文件/lib64/libc.so.6调用它的同级的刚才创建的带版本号的软连接libc-2.14.so
0 |
# LD_PRELOAD=/lib64/libc-2.14.so ln -s libc-2.14.so /lib64/libc.so.6 |
验证libc.so.6文件指向,正常的话会显示一个箭头指向
0 1 |
# ll /lib64/libc.so.6 lrwxrwxrwx. 1 root root 12 Nov 16 02:49 /lib64/libc.so.6 -> libc-2.14.so |
再输入一些其它一些常用命令(yum,cd,ls,python -V,perl -V)等,看是否正常。
至此,更新安装glibc完成。
注:一些出错提示:error while loading shared libraries: /lib64/libc.so.6: invalid ELF header
因为所有命令的运行都是靠这个文件(/lib64/libc.so.6),所以当删除它时,就会出现上面的提示,