Loading... 今天我对一个用Go语言编写的软件进行了升级,然而却遭遇了运行故障,提示信息表明需要提升GLIBC版本。 ```shell /lib64/libc.so.6: version `GLIBC_2.32' not found (required by ./xxx) /lib64/libc.so.6: version `GLIBC_2.34' not found (required by ./xxx) ``` 怀着乐观的心态,我决定把GLIBC直接更新到最新版本,然而,我并未预料到,这只是噩梦的开始。 ```shell wget https://ftp.gnu.org/gnu/glibc/glibc-2.37.tar.gz # 解压tar包 tar -xvf glibc-2.37.tar.gz # 1、进入glibc-2.37目录中 cd glibc-2.37 # 2、创建build目录 mkdir build # 3、进入build目录中 cd build # 4、执行./configure ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin # 5、安装 make && make install ``` 安装过程大约进行了五分钟,然后突然开始出现错误提示: ```shell make subdir=time -C ../time ..=../ objdir=/root/glibc-2.37/build -f Makefile -f ../elf/rtld-Rules rtld-all rtld-modules='rtld-setitimer.os' make[4]: Entering directory '/root/glibc-2.37/time' make[4]: Leaving directory '/root/glibc-2.37/time' make[3]: Leaving directory '/root/glibc-2.37/elf' make[2]: Leaving directory '/root/glibc-2.37/elf' /usr/bin/install -c -m 644 /root/glibc-2.37/build/libc.a /usr/lib64/libc.a /usr/bin/install -c -m 644 /root/glibc-2.37/build/libc_nonshared.a /usr/lib64/libc_nonshared.a /usr/bin/install -c /root/glibc-2.37/build/libc.so /lib64/libc.so.6.new mv -f /lib64/libc.so.6.new /lib64/libc.so.6 gcc -B/usr/bin/ -shared -nostdlib -nostartfiles \ -x assembler /dev/null -o /root/glibc-2.37/build/format.lds.so make[1]: *** [Makerules:1032: /root/glibc-2.37/build/format.lds] Floating point exception (core dumped) make[1]: Leaving directory '/root/glibc-2.37' make: *** [Makefile:12: install] Error 2 [root@pcname build]# ``` 接着我发现CPU占用率还是居高不下,我就决定查查看进程状况。 结果发现,所有指令都完全失效了。 我突然意识到,我可能并没有考虑任何版本兼容性的问题。于是,我打算重新下载2.28版本进行回滚,但是我发现wget和安装指令都已经无法正常运行,这让我一下慌了。 ```shell (base) [root@pcname ~]# ps aux | grep make grep: symbol lookup error: /lib64/libpthread.so.0: undefined symbol: __libc_siglongjmp, version GLIBC_PRIVATE ps: symbol lookup error: /lib64/libpthread.so.0: undefined symbol: __libc_siglongjmp, version GLIBC_PRIVATE (base) [root@pcname ~]# top top: symbol lookup error: /lib64/libpthread.so.0: undefined symbol: __libc_siglongjmp, version GLIBC_PRIVATE (base) [root@pcname ~]# yum update glib2 /usr/libexec/platform-python: symbol lookup error: /lib64/libdl.so.2: undefined symbol: _dl_vsym, version GLIBC_PRIVATE (base) [root@pcname ~]# ^C (base) [root@pcname ~]# LD_PRELOAD=/tmp/libc.so.6 mv /tmp/libc.so.6 /lib64/libc.so.6 ERROR: ld.so: object '/tmp/libc.so.6' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored. mv: symbol lookup error: /lib64/libpthread.so.0: undefined symbol: __libc_siglongjmp, version GLIBC_PRIVATE (base) [root@pcname ~]# find / -name 2.28 find: symbol lookup error: /lib64/libpthread.so.0: undefined symbol: __libc_siglongjmp, version GLIBC_PRIVATE (base) [root@pcname ~]# ps aux | grep make grep: symbol lookup error: /lib64/libpthread.so.0: undefined symbol: __libc_siglongjmp, version GLIBC_PRIVATE ps: symbol lookup error: /lib64/libpthread.so.0: undefined symbol: __libc_siglongjmp, version GLIBC_PRIVATE (base) [root@pcname ~]# strings /lib64/libc.so.6 |grep GLIBC_ grep: symbol lookup error: /lib64/libpthread.so.0: undefined symbol: __libc_siglongjmp, version GLIBC_PRIVATE strings: symbol lookup error: /lib64/libdl.so.2: undefined symbol: _dl_vsym, version GLIBC_PRIVATE (base) [root@pcname ~]# wget https://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz wget: symbol lookup error: /lib64/libpthread.so.0: undefined symbol: __libc_siglongjmp, version GLIBC_PRIVATE (base) [root@pcname ~]# rpm2cpio glibc-xxx.rpm | cpio -idmv rpm2cpio: symbol lookup error: /lib64/libpthread.so.0: undefined symbol: __libc_siglongjmp, version GLIBC_PRIVATE Floating point exception (core dumped) (base) [root@pcname ~]# reboot reboot: symbol lookup error: /lib64/libpthread.so.0: undefined symbol: __libc_siglongjmp, version GLIBC_PRIVATE ``` 赶紧查阅了相关资料,发现老版本的GLIBC可能是以链接的形式存在于lib64中,并没有被直接替换。这就解释了为何更新后出现错误。 于是我打开/lib64目录,找到了libc-2.28.so,同时我发现我正在使用的是libc.so.6,这应该就是新安装的版本。我决定尝试直接替换它们,怀着赌一把的心态,我首先删除了libc.so.6,然后创建了新的链接。 ```shell (base) [root@pcname ~]# LD_PRELOAD=/lib64/libc-2.28.so ln -s /lib64/libc-2.28.so /lib64/libc.so.6 (base) [root@pcname ~]# ps PID TTY TIME CMD 7957 pts/3 00:00:00 bash 1877531 pts/3 00:00:00 ps ``` 替换完成后,我用ps命令进行了测试,它居然恢复正常了! 尽管如此,我并没有立刻松口气,我决定再完整地重新安装一遍gclib。 我在 http://mirror.centos.org/centos/8-stream/BaseOS/x86_64/os/Packages/ 上下载了我需要的rpm包。 * glibc-2.28-228.el8.x86_64.rpm * glibc-common-2.28-228.el8.x86_64.rpm * glibc-devel-2.28-228.el8.x86_64.rpm * glibc-headers-2.28-228.el8.x86_64.rpm * glibc-langpack-en-2.28-228.el8.x86_64.rpm * glibc-langpack-zh-2.28-228.el8.x86_64.rpm * nscd-2.28-228.el8.x86_64.rpm 下载完毕后,我将它们放在一起进行安装: ```shell (base) [root@pcname ~]# rpm -Uvh *.rpm Verifying... ################################# [100%] Preparing... ################################# [100%] Updating / installing... 1:glibc-common-2.28-228.el8 ################################# [ 7%] 2:glibc-langpack-en-2.28-228.el8 ################################# [ 14%] 3:glibc-langpack-zh-2.28-228.el8 ################################# [ 21%] 4:glibc-2.28-228.el8 ################################# [ 29%] 5:glibc-headers-2.28-228.el8 ################################# [ 36%] 6:glibc-devel-2.28-228.el8 ################################# [ 43%] 7:nscd-2.28-228.el8 ################################# [ 50%] Cleaning up / removing... 8:glibc-devel-2.28-164.el8 ################################# [ 57%] 9:nscd-2.28-164.el8 ################################# [ 64%] 10:glibc-headers-2.28-164.el8 ################################# [ 71%] 11:glibc-langpack-zh-2.28-164.el8 ################################# [ 79%] 12:glibc-2.28-164.el8 ################################# [ 86%] 13:glibc-langpack-en-2.28-164.el8 ################################# [ 93%] 14:glibc-common-2.28-164.el8 ################################# [100%] [/etc/tmpfiles.d/murmur.conf:1] Line references path below legacy directory /var/run/, updating /var/run/murmur → /run/murmur; please update the tmpfiles.d/ drop-in file accordingly. [/usr/lib/tmpfiles.d/pesign.conf:1] Line references path below legacy directory /var/run/, updating /var/run/pesign → /run/pesign; please update the tmpfiles.d/ drop-in file accordingly. (base) [root@pcname ~]# reboot ``` 当我看到所有包都安装成功后,我终于轻松下来,重启了电脑。 回过头来想,还好我在所有命令无法使用的时候并没有盲目选择强制关机重启。否则,我估计就无法再进入命令行界面了。 这次的经历给我上了一堂深刻的课:在安装核心部件时,需要查阅并确认版本号,确保安装的版本是相互兼容的。 还有一点我十分感慨的是,在进行关键操作的时候,备份!备份!备份! 最后修改:2023 年 07 月 12 日 © 允许规范转载 打赏 赞赏作者 如果觉得我的文章对你有用,请随意赞赏