马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
把编译好的程序拷到 Ubuntu 上跑,一执行就甩一句 version `GLIBC_2.34' not found,明明在另一台机器上跑得好好的。这类问题不是程序坏了,也不是系统坏了,而是程序编译时链接的 glibc 比当前系统自带的版本新。下面按「确认 → 升级运行库 → 校验 → 不升级时的替代方案」四步走一遍。
一、先确认到底缺哪个符号、缺在哪
glibc 是系统级的运行库,版本号出现在动态链接阶段。先看看程序依赖了哪些库:
ldd ./your_program
如果某一行指向 libc.so.6 且程序在低版本系统上跑,就会报上面那个错。更精确的办法是把缺失符号查出来:
strings /lib/x86_64-linux-gnu/libc.so.6 | grep GLIBC_
输出里只有 GLIBC_2.2.5 到 GLIBC_2.31,而程序需要 2.32 以上,就坐实了是 glibc 版本低。
二、补一条新版本的软件源
Ubuntu 22.04 的 jammy 仓库里带的 libc6 是 2.35,够用;如果你的系统是 20.04(focal),默认只到 2.31,就需要先把源指到 jammy。打开源列表:
sudo vi /etc/apt/sources.list
把原来的一行镜像地址后面补上发行版代号 jammy,例如:
deb http://mirrors.aliyun.com/ubuntu/ jammy main
改完刷新索引:
sudo apt update
三、升级 libc6 并校验结果
然后安装高版本运行库:
sudo apt install libc6
装完再跑一次前面的 strings 校验:除了旧的 GLIBC_2.2.5 到 GLIBC_2.31,应该多出 GLIBC_2.32 到 GLIBC_2.35 这一段,最后是 GLIBC_PRIVATE。看到这段就说明新符号已经进了运行库。
四、顺手把自定义路径加进环境变量
如果你还把编译产物放到某个自建目录,比如 /usr/local/host/bin,需要让 shell 认得它:
sudo vim /etc/bash.bashrc
在最后一行加上(路径换成你自己的):
PATH=$PATH:/usr/local/host/bin
让当前会话立刻生效:
source /etc/bash.bashrc
注意是 bashrc 而不是 bash.bashrc 这种笔误形式,写错了不报错但也不生效。
五、升级前必须想清楚的几件事
- 把源从 focal 指到 jammy 属于跨大版本升级,apt 会一并拉进一批新包,务必先做一次全量 apt update && apt upgrade,别只装 libc6。
- 升级前给关键目录留个快照或备份,出问题能回滚。
- 生产机器上不要为了一个程序去动系统 glibc,风险远大于收益。
- 同一台机器上不要从别的发行版拷 libc.so.6 直接覆盖,不同发行版的符号约定不一样,覆盖完可能连 ls 都起不来。
六、不动系统的替代方案
- 把程序打进容器,用对应版本的基础镜像(比如 ubuntu:22.04 或 debian:bookworm),容器里自带够新的 glibc,宿主机完全不用改。
- 用 patchelf 给程序改动态库搜索路径,指向高版本的运行时目录。
- 回退编译机器的基础镜像,用与生产系统同版的编译环境重新出包,这是最干净的做法。
qidao123.com企服评测-应用市场 编辑提示
|