关于libc.so.6

前天突发奇想,就想自己编译一个路由器的ipk。因为路由器一直在使用的是pangubox系统(原pandorabox系统),虽然和openwrt同源,但相比openwrt少了一些软件包,部分软件包也不够新,yellowko要用到的这个软件官方源没有更新到最新,所以打算试试用官方提供的SDK来编译,结果把系统玩坏了23333。

网上看了一个openwrt的SDK使用教程,前面的东西都配置完成了,但当我想编译时出现了这样的提示

./scripts/config/conf:
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.27' not found (required by
./scripts/config/conf)

也就是说本机没有GLIBC的这个版本,需要安装。这是GNU项目所维护的标准C库,Linux系统通过一个libc.so.6的软链接指向本机的GLIBC文件,而系统中绝大部分指令都要依靠这个软链接才能执行。想要升级是比较麻烦的,因为它可以说是整个系统的基础,所以在系统安装好后基本上是不会动这个文件的。但是如果要升级,就一定会修改这个libc.so.6所链接的文件,可以使用ln -sf这样直接覆盖。有些同学习惯先删除再重建,但是一旦这个链接和原来的GLIBC文件断开,在shell中除了便几乎无法执行指令。可以在指令前添加LD_PRELOAD=glibc实际文件绝对路径,例如这样:

LD_PRELOAD=/lib/x86_64-linux-gnu/libc-2.23.so ll

这样手动加载了动态链接库,指令就可以正常运行。

经过这次折腾yellowko不建议单独升级GLIBC,因为这东西真不好搞,yellowko也没成功,Linux苦手2333,还是直接升级系统吧。

如果想要尝试升级GLIBC,请一定要注意以下几点,这样失败了还能救回来:

①首先得切换成root用户,因为想要更改libc.so.6这个文件是需要root权限的,而一旦链接断开,是没办法使用sudo或su的,万一出问题就真完了。因为出于安全考虑,这两个指令是不使用LD_PRELOAD这个环境变量的。(想想也是,随意替换系统的动态链接库的确太危险了,想想如果最常用的printf()函数如果被换成了一个黑客程序,再能使用root权限来执行,那么黑客就可以轻易攻陷我们的系统)

②需要记住系统以及新的GLIBC文件的位置,不同系统是不同的,例如yellowko使用的Ubuntu 16.04 server lts的在/lib/x86_64-linux-gnu里,因为一旦libc.so,6断开,那么ls这类命令是不直接用了的,但是cd和TAB还是可以用的,记不清还是可以用TAB来补救,如果新的库不能用,还可以把旧库链接回去。

③但是如果没有登录root账户但又把libc.so.6的链接断开了或者是断了之后不小心关机了呢,关机后甚至不能登录系统。对于这种情况,单凭当前的环境是无法解决了(至少yellowko是没找到办法),需要依靠外部的力量。例如使用Ubuntu桌面版的iso这种自带live os的镜像(实体机要烧到光盘或者做成U盘启动盘),在重启后通过修改BIOS进入光碟中试用系统,然后把libc,so.6重新链接回去。当然除此之外还可以使用一些急救盘之类的,总之,需要一个可以运行的操作系统来修改,如果是SSH远程登录的,不能直接接触到实体机器,那么这机器可能就挂掉了。


知识共享许可协议


本作品由yellowko采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据