改变我的工具链架构(在gentoo中)

改变我的工具链架构(在gentoo中)

这在某种程度上是 gentoo 特有的,所以我将在上下文中解释它,然后尝试将它抽象到通用的 Linux 机器。

当我的机器是 Athlon64 时,我一开始不小心将 CHOST 设置为“i686-pc-linux-gnu”。我想将其更改为“x86_64-pc-linux-gnu”。 有一个关于此的指南。 这不起作用。

第一步是“重新编译binutils,然后重新编译gcc”

这是问题的说明:

  1. 使用 gcc 编译 binutils - 这成功生成了新的 as、ar 等文件
  2. 休息海湾合作委员会。 gcc 现在正在尝试使用新的 /usr/bin/as - 但它无法与它们一起使用
  3. 由于gcc无法编译任何东西,所以我无法编译gcc。我必须恢复为、ar 等;然后恢复 CHOST 更改,并重新编译 binutils。

所以我尝试了以下方法:

  1. 备份为、ar 等
  2. 编译binutils,渲染gcc inoperabe
  3. 将 ar、as 等链接到我备份的旧版本
  4. 尝试编译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 错误(完成链)。

所以它看起来:

  1. gcc 的编译依赖于新版本的 glibc
  2. 要运行 gcc,binutils 必须是旧版本

步骤我没有尝试过,因为它太复杂了,我想先征求意见,是:

  1. 在新架构下编译binutils,
  2. 将 as、ar 等重新链接到旧的可执行文件
  3. 使用 old-gcc 和 old-binutils 编译新的 glibc
  4. 使用 old-gcc 和 old-binutils 编译 new-gcc,但使用 new-glibc
  5. 将 as、ars 等重新链接到 new-binutils
  6. 像老板一样重新编译一切

上述#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位内核,启动它,然后参见上面的内容。

相关内容