Linux无坑升级GLIBC

前言

还在为老系统用不到新的闭源软件而烦恼吗
还在为网上教程不够详细,glibc升级屡屡失败而发愁吗
那就看看这篇博客吧,带你轻松升级glibc

其实升级GLIBC比单纯升级内核要复杂,也更危险,需要更谨慎
内核升级失败还有其它内核可进入系统,GLIBC升级失败,系统就嗝儿屁了~

注意

  1. 整个流程最好最均使用root用户,否则安装时使用sudo要特别注意环境变量的问题
  2. 整个编译安装环节中源码所在路径不要包含中文(严格来说是多字符编码的符号,包括但不限于中文(繁/简)、日文、韩文等或与它们相关的标点符号)
  3. 安装前要多开几个终端并切换为root用户,主要是以防万一,否则安装环节出现问题可能导致当前终端不可用,新终端也可能会因为环境问题无法拉起
  4. 如果是虚拟机,最好在安装前拍摄快照以防万一,方便失败后回退;如果是物理机,若失败可以选择利用Linux PE修复/将系统盘挂载到正常Linux修复/利用DiskGenius等方式手动修复,Windows PE可能会遇到不识别Ext文件系统导致无法挂载或者文件权限(d-r-w-x...)问题
  5. 第四点中的失败指的是无法利用当前系统做任何的操作,如果还具有root权限,如果还能配置环境变量,那么就不算失败(参见:步骤九)
  6. 最好将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,安装对多字符编码的支持使中文路径恢复正常


根据上述步骤操作可以避免大部分的报错和坑

结语

该博客为处女作,是从本人的有道云摘取的之前的笔记
创作原因是本人参考网上各个文章在升级glibc时屡屡失败
其它文章要么重复、要么省略了一些步骤,要么和我本人遇到的情况不一致
最后恼羞成怒(╬ ̄皿 ̄),集各家之所长 + 一步步调查和踩坑踩出来的
若有不足,从自己身上找找原因ಠᴗಠ,PS:根据自己环境和错误信息再调查分析下
每个人的环境都不同,我也只能帮到这儿了

posted on 2023-05-23 23:25  书生执笔画浮沉  阅读(10955)  评论(0编辑  收藏  举报

导航