古いバージョンの gcc をビルドするにはどうすればいいですか? crti.o が見つからないというエラー

古いバージョンの gcc をビルドするにはどうすればいいですか? crti.o が見つからないというエラー

Ubuntu 11.10 で古い gcc (具体的には 4.5.2) をビルドし、「/usr/bin/ld: crti.o が見つかりません: そのようなファイルまたはディレクトリはありません」というエラーを回避するにはどうすればよいでしょうか?

少し調べてみたところ、似たような項目がいくつか見つかりましたが、実際に私の問題を解決するものはありませんでした。

  • すべてのパッケージ(libc6-devなど)が再インストールされていることを確認しました。この質問
  • crti.oが/usr/lib32と/usr/lib/x86_64-linux-gnuに存在することを確認しました。また、ld.so.confがこれらのディレクトリを参照するように設定されていることを確認しました。
  • LIBRARY_PATH=/usr/lib/x86_64-linux-gnu を make 呼び出しの先頭に追加することで機能することを確認しましたが、これを避けたいと思います (makefile で分岐点になります)
  • --with-build-sysroot でいろいろ試してみましたが、成功しませんでした (つまり、設定すべき正しいフラグがわからないだけかもしれません)
  • straceで実行する場合(この答え) では、crti.o への単なる参照を確認できます。

    13240 open("crti.o", O_RDONLY) = -1 ENOENT (そのようなファイルまたはディレクトリはありません)

ありがとう!

答え1

GCC の非常に新しいバージョンでも、このメッセージが表示されて失敗します。これは、新しい Debian/Ubuntu リリースがマルチアーキテクチャ (つまり、1 つのファイルシステムに複数のマシンのバイナリをインストールする) をサポートするため、ライブラリが標準の場所から移動されたためです。

これを修正するためのGCCパッチがあるここ(まだ最終版は承認されていないが、Ubuntuには適している)そして、おそらくそれほど手間をかけずに古いGCCにも適用されるだろう。GCCを次のように設定する必要があると思う。--enable-multiarch、 か何か。

その間、ソフト リンクを作成するのは良い修正です。

cd /usr/lib
ln -s x86_64-linux-gnu/crt*.o .

(32 ビット インストールではフォルダー名が異なります)。

お役に立てれば幸いです。

答え2

私も同じ問題を抱えていました。 から へのシンボリックリンクを作成する/usr/libs/crt?.o ことで、/usr/lib/x86_64-linux-gnu/crt?.o問題は解決しました。

答え3

私はいくつかの回避策でこの問題を解決しました。これはあなたにとって役立つかもしれません。

まず、 で GCC をビルドしてLIBRARY_PATH=/usr/lib/x86_64-linux-gnu、ビルド ブートストラップ プロセスがcrt?.o開始ファイルの場所を認識できるようにします。

次に、システム全体に影響する場所crt?.oにシンボリックリンクを作成する代わりに、実行可能ファイルがインストールされているディレクトリに対応するディレクトリに、これらの 3 つのファイルをシンボリックリンクすることができます。これは実際には開始ファイルの検索パスのほぼ先頭にあるため、開始ファイルは見つかりますが、他のものには影響しません。/usr/lib${prefix}/lib/gcc/...${prefix}/bingcc

私の場合、それらを置く特定のディレクトリは でしたlib/gcc/x86_64-unknown-linux-gnu/4.3.2/。そこには既に他のファイルが含まれているため、正しいディレクトリを見つけることができますcrtbegin.o

答え4

私は、Ubuntu precise x86_64 で GCC 4.1.2 をビルドしました。皆さんが行ったように、最後のコマンド「xgcc」の strace を見て、32 ビットの C ランタイムを探し、次のように /32/ を grep で検索しました。私の C ランタイムは、libc6-dev-i386 パッケージによって提供される /usr/lib32 にあります。

fgrep /32/ strace-output.txt | grep /usr/lib | head -1
access("/usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32/crti.o", R_OK) = -1 ENOENT (No such file or directory)

そこで、xgcc が検索したディレクトリに crt?.o シンボリック リンクを作成しました。

sudo mkdir -p /usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32
cd /usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32
sudo ln -s /usr/lib32/crt1.o 
sudo ln -s /usr/lib32/crtn.o 
sudo ln -s /usr/lib32/crti.o 

これで GCC 4.1.2 を正常にビルドできました。

関連情報