web-dev-qa-db-ja.com

ツールチェーンアーキテクチャの変更(gentoo)

これはやや紳士特有なので、その文脈で説明してから、一般的なLinuxマシンに抽象化してみます。

私のマシンがAthlon64の場合、最初は誤ってCHOSTを「i686-pc-linux-gnu」に設定しましたが、注意を払っていませんでした。 「x86_64-pc-linux-gnu」に変更したいのですが。 このためのガイドがあります。 動作しません。

最初のステップは「binutilsを再コンパイルしてからgccを再コンパイルする」です。

示されている問題は次のとおりです。

  1. Gccを使用してbinutilsをコンパイルします-これにより、新しいas、arなどのファイルの生成に成功します
  2. このbreaksgcc。 gccは新しい/ usr/bin/asを使おうとしていますが、それらでは機能しません
  3. Gccは何もコンパイルできないので、gccをコンパイルできません。 as、arなどに戻す必要があります。次に、CHOSTの変更を元に戻し、binutilsを再コンパイルします。

だから私は以下を試しました:

  1. としてバックアップ、arなど
  2. Binutilsをコンパイルし、gccを動作不能にします
  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

Thisはglibcエラー(チェーンの完了)です。

そうらしい、それっぽい:

  1. gccがコンパイルするには、新しいバージョンのglibcに依存します。
  2. gccを実行するには、binutilsが古いバージョンである必要があります

私が試したことがない手順は非常に複雑なので、最初に意見を聞きたかったのですが、次のとおりです。

  1. 新しいアーキテクチャでbinutilsをコンパイルします。
  2. as、arなどを古い実行可能ファイルに再リンクします
  3. old-gccとold-binutilsを使用して新しいglibcをコンパイルします
  4. new-gccをold-gccとold-binutilsでコンパイルしますが、new-glibc
  5. as、arsなどをnew-binutilsに再リンクします
  6. 上司のようにすべてを再コンパイルします

上記の#4が機能する可能性はありますか?完全に再インストールせずにこれを達成する希望はありますか?

4
Tom Ritter

私の知る限り、それは不可能です。ツールチェーンはバキュームには存在せず、相互に関連していることに注意してください。

うまくいくかもしれないのは、新しいインフラストラクチャのクロスコンパイラを構築することですが、私は本当にそれを疑っています-glibcの更新の「原子性」はすべてを壊します。

システムのバックアップと再インストールをお勧めします。

2

AMD64 stage3 tarballをダウンロードして、gccのコピーを使用してみましたか?

2
Thomas

カーネルが64ビットの場合(したがって64ビットバイナリを実行できる場合)、通常の手順に従って、chrootで新しいx86_64Gentooインストールを開始できます。私は以前に同様のことをしました—事実上再インストールしますが、それでも古いシステムを実行しています。インストールする予備のブロックデバイスがない場合は、サブディレクトリを使用してinit=chroot\040/new\040/bin/sinitで起動するか、最小限の環境にドロップダウンしてディレクトリをシャッフルできます。

カーネルが32ビットの場合は、64ビットカーネルを見つけるか、64ビットへのクロスコンパイラをビルドして64ビットカーネルをビルドし、起動してから上記を参照してください。

1
ephemient