Ubuntu 18.04 升级 libc Your system has GNU libc version 2.27. The calibre binaries require at least version: 2.31 (released on 2020-02-01). Update your system.
注意,libc是系统底层库,每条命令执行都会调用,所以请谨慎修改!!!
注意,libc是系统底层库,每条命令执行都会调用,所以请谨慎修改!!!
注意,libc是系统底层库,每条命令执行都会调用,所以请谨慎修改!!!
修改错误会导致系统命令行和其他界面失效,启动系统时报错。
------------------------------------------------------------------------------------
制作 ubuntu 的启动盘(U盘或光盘), 通过试用 ubuntu(选择 Try Ubuntu without installing) 来完成 glibc 最后的安装
或
请准备一个U盘,PE系统,可以在文件修改失败时,救援系统。
进入 ubuntu live 试用环境, 连接好网络, 同样准备以下环境
$ sudo apt update $ sudo apt install build-essential gawk bison
-------------------------------------------------------------------------------------
经过测试,在Ubuntu 18.04 下 将默认 libc 2.27 替换成 2.31 后系统启动失败。
-------- 正文开始 ---------
安装 calibre 时,提示 GNU libc 版本低。( Ubuntu 18.04 版本是 2.27 最方便的方法是升级系统到 20 或 22)
sudo -v && wget -nv -O- https://download.calibre-ebook.com/linux-installer.sh | sudo sh /dev/stdin Using python executable: /usr/bin/python3 2022-12-06 11:06:49 URL:https://download.calibre-ebook.com/linux-installer.sh [33639/33639] -> "-" [1] Your system has GNU libc version 2.27. The calibre binaries require at least version: 2.31 (released on 2020-02-01). Update your system.
查看源码所知,libc(C 标准库) 是 Python 标准库自带的 ctypes 模块里调用的。
问:为什么python 要用到 libc 库呢?
答:因为Python 和 C 的混合编程工具,所以要用到
文件位置:
Windows 系统下的 C 标准库动态链接文件为 msvcrt.dll
(一般在目录 C:\Windows\System32 和 C:\Windows\SysWOW64 下分别对应 32-bit 和 64-bit,
使用时不用刻意区分,Python 会选择合适的)
Linux 系统下的 C 标准库动态链接文件为 libc.so.6 (以 64-bit Ubuntu 系统为例, 在目录 /lib/x86_64-linux-gnu 下)
两种查看 glibc 版本方法:
方法一:
ldd --version ldd (Ubuntu GLIBC 2.27-3ubuntu1.5) 2.27 Copyright (C) 2018 自由软件基金会。 这是一个自由软件;请见源代码的授权条款。本软件不含任何没有担保;甚至不保证适销性 或者适合某些特殊目的。 由 Roland McGrath 和 Ulrich Drepper 编写。
方法二:
strings /lib/x86_64-linux-gnu/libm.so.6 | grep GLIBC_
先查找一下本机的 libc 位置。
因为是 libc 是动态库,是被调用的,所以用 whereis 命令查询不到,就只能用 find 搜索了。
查到到的结果:
$ find /usr -name "libc.so" /usr/lib32/libc.so /usr/lib/x86_64-linux-gnu/libc.so /usr/libx32/libc.so
根据文章开头提示“GNU libc version 2.27” 那就是 /usr/lib/x86_64-linux-gnu/libc.so 这个。
备份: tar 打包
注意,不要用 mv 直接修改 libc.so.6 和 libm.so.6 名字方式备份 !!!
注意,不要用 mv 直接修改 libc.so.6 和 libm.so.6 名字方式备份 !!!
注意,不要用 mv 直接修改 libc.so.6 和 libm.so.6 名字方式备份 !!!
每条命令都会用到这个库,如果修改了,任何命令就执行不了了
cd /usr/lib/x86_64-linux-gnu/ sudo tar -cf libc.so.6_bak_2.27.tar libc.so.6 libm.so.6
备份好的:
下载源码编译安装:
更新依赖工具:
$ sudo apt install build-essential gawk bison texinfo
修改默认环境变量
## 把旧的变量内容保存到 LD_LIBRARY_PATH_old 变量里 LD_LIBRARY_PATH_old=$LD_LIBRARY_PATH ## 清空(删除) 变量内容 LD_LIBRARY_PATH=
下载地址:
http://ftp.gnu.org/pub/gnu/libc/
解压: (注意,不要在有中文的路径下编译)
tar -zxf glibc-2.31.tar.gz cd glibc-2.31/
注:注意版本号替换成你的
新建目录:
mkdir build/ && cd build/
配置安装路径:
../configure --prefix=/usr/local/glibc-2.31
注:注意版本号替换成你的
显示以下内容,执行成功:
configure: creating ./config.status config.status: creating config.make config.status: creating Makefile config.status: creating config.h config.status: executing default commands
目录下也产生文件:
$ ll 总用量 96K drwxrwxr-x 2 ubuntu ubuntu 4.0K 12月 6 12:37 bits/ -rw-rw-r-- 1 ubuntu ubuntu 7.9K 12月 6 12:37 config.h -rw-rw-r-- 1 ubuntu ubuntu 33K 12月 6 12:37 config.log -rw-rw-r-- 1 ubuntu ubuntu 4.2K 12月 6 12:37 config.make -rwxrwxr-x 1 ubuntu ubuntu 33K 12月 6 12:37 config.status* -rw-rw-r-- 1 ubuntu ubuntu 560 12月 6 12:37 Makefile
编译:
sudo make -j4
-j4 代表用4线程编译(加快编译速度),编译出错时,可以不加
安装:
suod make install
复制 生成 so 文件:
sudo cp /usr/local/glibc-2.31/lib/libc-2.31.so /lib/x86_64-linux-gnu/ sudo cp /usr/local/glibc-2.31/lib/libm-2.31.so /lib/x86_64-linux-gnu/
注:目录 /usr/local/glibc-2.31/ 就是上面 --prefix=/usr/local/glibc-2.31 设置的安装路径
创建软件连接:
注意,要准备好启动盘或救援设备,再操作下面这步,修改失败系统可能会出问题!!!
注意,要准备好启动盘或救援设备,再操作下面这步,修改失败系统可能会出问题!!!
注意,要准备好启动盘或救援设备,再操作下面这步,修改失败系统可能会出问题!!!
cd /lib/x86_64-linux-gnu/ sudo ln -sf libm-2.31.so libc.so.6 && sudo ln -sf libc-2.31.so libm.so.6
-sf, s 创建软连接, f是强制覆盖
验证:
使用下面任意一条命令,查看替换完的版本
ldd --version 或 strings /lib/x86_64-linux-gnu/libm.so.6 | grep GLIBC_
----------
错误提示:
在 ../configure 时 ,
提示: gawk 丢失或太旧,需要安装
configure: error: *** These critical programs are missing or too old: gawk bison *** Check the INSTALL file for required versions.
提示: makeinfo 版本警告,是 texinfo 需要安装
configure: WARNING: *** These auxiliary programs are missing or incompatible versions: makeinfo *** some features or tests will be disabled. *** Check the INSTALL file for required versions. checking LD_LIBRARY_PATH variable... contains current directory configure: error: *** LD_LIBRARY_PATH shouldn't contain the current directory when *** building glibc. Please change the environment variable *** and run configure again.
提示:LD_LIBRARY_PATH 变量内容问题
configure: error: *** LD_LIBRARY_PATH shouldn't contain the current directory when *** building glibc. Please change the environment variable *** and run configure again.
提示:注意,不要在有中文的路径下编
Makefile:142: recipe for target 'glibc-2.31/build/manual/libc.info' failed
参考:
https://blog.csdn.net/jiang_huixin/article/details/123414527
https://blog.csdn.net/u014634615/article/details/120333287
https://blog.csdn.net/qq_31511955/article/details/88179586
https://blog.csdn.net/jiang_huixin/article/details/123414527
https://blog.csdn.net/qq_24755999/article/details/78722788
https://zhuanlan.zhihu.com/p/549870561