Linux无坑升级GLIBC
前言
还在为老系统用不到新的闭源软件而烦恼吗
还在为网上教程不够详细,glibc升级屡屡失败而发愁吗
那就看看这篇博客吧,带你轻松升级glibc其实升级GLIBC比单纯升级内核要复杂,也更危险,需要更谨慎
内核升级失败还有其它内核可进入系统,GLIBC升级失败,系统就嗝儿屁了~
注意
- 整个流程最好最均使用root用户,否则安装时使用sudo要特别注意环境变量的问题
- 整个编译安装环节中源码所在路径不要包含中文(严格来说是多字符编码的符号,包括但不限于中文(繁/简)、日文、韩文等或与它们相关的标点符号)
- 安装前要多开几个终端并切换为root用户,主要是以防万一,否则安装环节出现问题可能导致当前终端不可用,新终端也可能会因为环境问题无法拉起
- 如果是虚拟机,最好在安装前拍摄快照以防万一,方便失败后回退;如果是物理机,若失败可以选择利用Linux PE修复/将系统盘挂载到正常Linux修复/利用DiskGenius等方式手动修复,Windows PE可能会遇到不识别Ext文件系统导致无法挂载或者文件权限(d-r-w-x...)问题
- 第四点中的失败指的是无法利用当前系统做任何的操作,如果还具有root权限,如果还能配置环境变量,那么就不算失败(参见:步骤九)
- 最好将binutils、texinfo升级至你要安装的GLibc(发布时间上相近)匹配的版本,若在编译升级这两个包的过程中提示要高版本GLibc,那么该步骤可以推迟到GLibc安装时的步骤七
步骤概括
下载源码 -> 编译 -> 将编译好的二进制文件设置为终端临时环境变量 -> 用配置好环境变量的终端执行make install
一、下载与解压
下载一般从国内开源镜像站下载,直接搜索“开源镜像站”
会有好多大学的,进去 ctrl + f 搜索“GNU”一般就能找到存放目录
如果开源镜像站没找到,那就从gnu官方慢慢下
下载好后,如果是tar.gz或者tgz包,都可以用以下命令进行解压(其它格式自行必应)
tar -zxvf ./*gz && cd ./解压后的目录
二、创建构建目录
mkdir ./build && cd ./build
mkdir 创建一个构建目录 build 并 cd 进入
三、进行编译配置
../configure --prefix=/usr CFLAGS="-g -O2 -fPIC -funwind-tables"
配置参数根据需求添加
--prefix=/usr 指定安装路径(CentOS7 bin目录与lib64目录均在/usr下,其它系统根据情况设定)
-g 有符号的
-O2 优化级别(-O3对其它非X86指令集的编译是不太可靠的,我们的产品在启用了-O3后在编译aarch64 ELF文件时总会报汇编上的错误,故我采用了-O2认为更稳妥些,如果你的处理器架构就是x86或者x64那么可以尝试改成-O3)
-fPIC 位置无关的(若不指定会导致编译生成的ldconfig文件执行时段错误x86_64/start.S:115 call *__libc_start_main@GOTPCREL(%rip))
-funwind-tables 允许正在运行的程序从给定执行点返回函数调用堆栈的数据
四、编译
make -j8
使用8个线程进行编译
五、配置环境变量
编译结束后将编译好的库文件路径设置到临时环境变量LD_LIBRARY_PATH中,必要时可将编译好的ld-linux链接器设置到LD_PRELOAD
谨慎起见可以先测试执行(路径替换成自己的)
LD_LIBRARY_PATH=/home/user/glibc-2.35/build/:/home/user/glibc-2.35/build/nptl/:/home/user/glibc-2.35/build/dlfcn/:$LD_LIBRARY_PATH cp 随便一个文件 随便一个路径
看看会不会报错,如果报链接器相关的错误(我忘了具体错误长什么样了)
就把LD_PRELOAD环境变量设置为新编译好的ld-linux文件路径(包含文件名),两个环境变量之间加空格分隔即可。
这样先试试水,好处是环境变量仅影响这一条命令,出问题不会导致当前使用的终端瘫痪,多试几个常用命令,没问题的话再进行下面的步骤,且可以略过步骤六
export LD_LIBRARY_PATH=/home/user/glibc-2.35/build/:/home/user/glibc-2.35/build/nptl/:/home/user/glibc-2.35/build/dlfcn/:$LD_LIBRARY_PATH
路径1 /home/user/glibc-2.35/build/ libc等库文件所在路径
路径2 /home/user/glibc-2.35/build/nptl libpthread等库文件所在路径
路径3 /home/user/glibc-2.35/build/dlfcn libdl等库文件所在路径
如果在测试时配置了LD_PRELOAD环境变量后,所有常用命令才可用的话,那么需要再执行
export LD_PRELOAD=你的新ld-linux所在路径(注意是包含文件名的全路径)
原因是老的ld-linux动态链接器与libc版本差异太大或有其它不兼容的情况
六、在终端中测试一些常用的命令
如果步骤五已经进行了充分测试,则可以略过此步骤
测试一些常用的命令(ls、cp、mv、ln、make、gcc、find等)不再有任何库相关错误,若还有那么就将相应的新库路径增加进步骤五
以上命令能执行即可,不需要测试实际功能,比如:make -v 如果能正常打印版本信息就表示没问题
七、升级binutils、texinfo
此时若还没有将binutils、texinfo升级那么就可以 新建命令终端->配置步骤五,使用新的GLibc环境(环境变量)将这俩源码包进行编译升级,若已升级忽略此步骤
八、提前解决安装报错
vim ./../scripts/test-installation.pl 130行左右 增加行 && $name ne "nss_test2" 忽略对nss_test2的检查(主流做法,据说不影响安装及使用)
if ($name ne "nss_ldap" && $name ne "db1"
&& $name ne "thread_db"
&& $name ne "nss_test2"
&& $name ne "nss_test1" && $name ne "libgcc_s") {
$link_libs .= " -l$name";
$versions{$name} = $version;
}
九、安装
同样的,在执行以下命令前,必须确保使用的是新的环境变量
否则安装过程必报错且会导致系统不可用(CentOS 7 现象)
make install
如果在忘记配置环境变量的前提下,执行了命令且失败了
那么可以通过重新配置环境变量然后再次执行该命令进行补救
十、恢复中文支持
在build目录中执行make localedata/install-locales -j8,安装对多字符编码的支持使中文路径恢复正常