古いgccバージョンをどのように構築しますか?crti.oに関するエラーが見つからない


10

Ubuntu 11.10で古いgcc(具体的には、4.5.2)をビルドして、「/ usr / bin / ld:can find crti.o:no such file or directory」に関するエラーを回避するにはどうすればよいですか?

私は少し掘り下げていくつかの同様のアイテムを見つけましたが、実際に私の問題を解決するものはありません:

  • 私のすべてのパッケージ(libc6-devなど)がこの質問に従って再インストールされていることを確認しました
  • crti.oが/ usr / lib32および/ usr / lib / x86_64-linux-gnuに存在すること、およびld.so.confがこれらのディレクトリを参照するように構成されていることを確認しました
  • make呼び出しの前にLIBRARY_PATH = / usr / lib / x86_64-linux-gnuを付けることで動作することを確認しましたが、これは避けたい(makefileで分岐点になる)
  • --with-build-sysrootでさまざまなことを試しましたが、成功しませんでした(読んでください:設定する正しいフラグがわからないだけかもしれません)。
  • この回答のとおり)straceで実行すると、crti.oへの参照のみが表示されます。

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

ありがとう!

回答:


7

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


これは機能します、はい。しかし、基盤となるファイル構造をいじるのではなく、gccインストールを微調整するという線に沿った解決策を望んでいました...
Matt

私の場合はそれを追加したかったので、glibcとGCCを再コンパイルしましたが、/ usr / bin /にある古いslackware-gccバリアントを削除するのを忘れていました。後者を削除すると、特定の項目(gccなど)を再度コンパイルできます。
シェビー

10

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

ここでそれを修正するGCCパッチがあり(まだ承認されていない最終バージョンですが、Ubuntu用に修正されています)、おそらくそれほど努力せずに古いGCCに適用される可能性があります。--enable-multiarchか何かでGCCを設定する必要があると思います。

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

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

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

お役に立てば幸いです。


マルチアーチであることのポイントをありがとう。それが機能しなくなった「なぜ」の解決を望んでいました。
マット

2

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

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

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

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


1

Ubuntuに正確なx86_64でGCC 4.1.2をビルドしました。あなたがしたように、私は次のように32ビットのCランタイム、grep-ped / 32 /を探す最後のコマンド「xgcc」のstraceを調べました。私の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を正常にビルドしました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.