Ubuntu 18.04 升级 glibc-2.29 导致异常如何还原?

2022-05-08 09:57:45 +08:00
 0xroot
源码编译的 glibc-2.29 ,make install 之后 ldconfig 完 shell 就异常了:
ls
11928 segmentation fault (core dumped) ls --color=tty


现在还原的话应该咋操作?重新安装 kernel 貌似不行,感谢!!!
3895 次点击
所在节点    程序员
19 条回复
lcdtyph
2022-05-08 10:02:42 +08:00
用 18.04 的镜像引导进入 try ubuntu
然后 mount 你自己的硬盘,把 try ubuntu 环境里的 libc 复制到你硬盘里对应位置就行了

libc 是用户态的,你重装 kernel 有什么用
0xroot
2022-05-08 10:04:47 +08:00
@lcdtyph 感谢,我找个优盘试试
hei1000
2022-05-08 11:13:36 +08:00
glibc 这种系统基础库最好不要自己安装,前一段时间 Archlinux 没有及时更新 glibc 库版本都被好多人骂(比如 https://www.reddit.com/r/archlinux/comments/scisqp/archs_unmaintained_glibc_is_a_security_risk/),因为这种东西可不是普通的软件包,上游不测试好会有很多问题
FranzKafka95
2022-05-08 12:02:28 +08:00
居然想着动 glibc ,吃亏了吧
aloxaf
2022-05-08 12:12:35 +08:00
教人往根目录下 make install 装软件的教程是蠢
教人往根目录下 make install 升级 glibc 的教程就是坏了
0xroot
2022-05-08 14:05:49 +08:00
@FranzKafka95
@hei1000

分析仪带的软件依赖 glibc 特定版本,吃大亏了
Chingim
2022-05-08 16:09:12 +08:00
所以我特别喜欢 go 发行的软件,下了就能用,而不会提示这库那库不满足要求
findex
2022-05-08 16:18:27 +08:00
肯定不能单升级 glic ,glibc 可是牵一发动全身,所有工具链(编译器等)得用同一个 glibc 都编译一遍,然后在用新工具链编译一遍以前的软件。
我以前做 Linux 系统的时候,遇到过这个。这个和 kernel 无关。如果你想回去,可以尝试 chroot 手动安装 ubuntu18.04 原装的 glibc ,然后用官方的源下载官方用特定版本 glibc 给你编译好的各种软件。如果你想尝试特定版本的 glibc ,可以走一下自己做一个 Linux 系统……
msg7086
2022-05-08 17:08:10 +08:00
@0xroot #6 glibc 基本等同于发行版版本了。如果你要用的软件依赖 glibc 的最低版本,那么一般意味着这款软件需要某个特定的 Linux 发行版版本才能运行。你这种情况可以试试添加 Ubuntu 20.04 的源,然后只安装 libc6 关联的包,可以做出一个缝合怪系统来,有一定概率可以正常运行。

我一般是拿 Debian 做 glibc 缝合怪的,很少会出问题。
0xroot
2022-05-08 17:28:55 +08:00
@msg7086 咨询了一下开发者,确实是需要 20.04

@findex 感谢解答,第一次踩 glibc 的坑
seers
2022-05-08 17:29:18 +08:00
@Chingim 冷知识,golang 运行时依赖 glibc ,但是只要不是上古版本基本上都能跑
lcdtyph
2022-05-08 18:13:43 +08:00
@seers #11
冷冷知识,golang build 的时候设置 CGO_ENABLED=0 可以运行时也不依赖 glibc
FranzKafka95
2022-05-08 22:58:58 +08:00
@lcdtyph 冷啥知识,只要有 CGO 就对 glibc 有依赖,再开启 CGO 的情况下又想避免 glibc 版本依赖,还得使用静态链接。
FranzKafka95
2022-05-08 23:00:01 +08:00
golang 某些库是必然依赖 cgo ,如 net, os/user 还有 sqlite
FranzKafka95
2022-05-08 23:01:16 +08:00
@seers ubantu18.04 的 glibc 版本好像是 2.27 ,某些 golang 库跑不了
wwqgtxx
2022-05-08 23:57:46 +08:00
@FranzKafka95 net 从 N 个版本开始就不依赖 cgo 了,至于 sqlite 也有 pure go 的版本,哪有什么必然依赖的
wwqgtxx
2022-05-09 00:02:31 +08:00
net 关于 CGO 的文档: https://pkg.go.dev/net#hdr-Name_Resolution
sqlite 的 pure go 版本: https://pkg.go.dev/modernc.org/sqlite
lcdtyph
2022-05-09 00:42:42 +08:00
@FranzKafka95 我当然知道 cgo 与 c runtime 的依赖,我只是在回复那一层说 golang 运行时依赖 libc
feather12315
2022-05-09 00:48:06 +08:00
依赖 glibc 的,是因为动态链接 glibc 时指定了 glibc 的版本( objdump -T xxx 可以看到 @glibc-xx )。
为啥这么指定?因为涉及 abi 兼容性。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/851496

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX