这在某种程度上是 gentoo 特有的,所以我将在上下文中解释它,然后尝试将它抽象到通用的 Linux 机器。
当我的机器是 Athlon64 时,我一开始不小心将 CHOST 设置为“i686-pc-linux-gnu”。我想将其更改为“x86_64-pc-linux-gnu”。 有一个关于此的指南。 这不起作用。
第一步是“重新编译binutils,然后重新编译gcc”
这是问题的说明:
- 使用 gcc 编译 binutils - 这成功生成了新的 as、ar 等文件
- 这休息海湾合作委员会。 gcc 现在正在尝试使用新的 /usr/bin/as - 但它无法与它们一起使用
- 由于gcc无法编译任何东西,所以我无法编译gcc。我必须恢复为、ar 等;然后恢复 CHOST 更改,并重新编译 binutils。
所以我尝试了以下方法:
- 备份为、ar 等
- 编译binutils,渲染gcc inoperabe
- 将 ar、as 等链接到我备份的旧版本
- 尝试编译gcc
gcc 编译失败并显示:
/usr/x86_64-pc-linux-gnu/bin/ld: skipping incompatible /usr/lib/libc.so when searching for -lc
/usr/x86_64-pc-linux-gnu/bin/ld: skipping incompatible /usr/lib/libc.a when searching for -lc
/usr/x86_64-pc-linux-gnu/bin/ld: cannot find -lc
collect2: ld returned 1 exit status
这是一个 glibc 错误(完成链)。
所以它看起来:
- gcc 的编译依赖于新版本的 glibc
- 要运行 gcc,binutils 必须是旧版本
步骤我没有尝试过,因为它太复杂了,我想先征求意见,是:
- 在新架构下编译binutils,
- 将 as、ar 等重新链接到旧的可执行文件
- 使用 old-gcc 和 old-binutils 编译新的 glibc
- 使用 old-gcc 和 old-binutils 编译 new-gcc,但使用 new-glibc
- 将 as、ars 等重新链接到 new-binutils
- 像老板一样重新编译一切
上述#4 有可能起作用吗?我是否有希望在不完全重新安装的情况下完成此任务?
答案1
据我所知这是不可能的。请记住,工具链并不存在于真空中,而是相互关联的。
可能有用的是构建新基础设施的交叉编译器,但我真的很怀疑 - glibc 更新的“原子性”会破坏一切。
我建议备份并重新安装系统。
答案2
您是否尝试过下载 amd64 stage3 tarball 并使用 gcc 的副本?
答案3
如果您的内核是 64 位(因此您可以运行 64 位二进制文件),您可以按照常规说明在 chroot 中启动新的 x86_64 Gentoo 安装。我以前也做过类似的事情——有效地重新安装,但仍然运行旧系统。如果您没有空闲的块设备可供安装,则可以使用子目录并启动init=chroot\040/new\040/bin/sinit
或下拉至最小环境来随机调整目录。
如果你的内核是32位的,找到一个64位内核或者构建一个64位的交叉编译器来构建一个64位内核,启动它,然后参见上面的内容。