4

組み込みの powerpc システム用のカーネル モジュールを数年間コンパイルしてきましたが、説明のつかない安定性の問題がまれにありますが、一般的には問題ありません。最近、ある同僚が、カーネル モジュールはカーネルと同じコンパイラでコンパイルする必要があると指摘しました。少し調べてみると、カーネル (montavista Linux 2.4.20) が gcc3.4.1 でコンパイルされており、(denx eldk) gcc4.0.0 を使用していることがわかりました。最近、ユーザー空間コード用に gcc4.7.1 をビルドしましたが、このバージョンでビルドされたカーネル モジュールをロードすると、システムがクラッシュします。次に、ソースから gcc3.4.1 をビルドします。一部のビルドは機能し、一部のビルドは機能しません。make スクリプトに問題がある可能性があると思いますが、それは別の話です。

だから私の質問:私の同僚は正しいですか?もしそうなら、非互換性の原因となる.oファイルの違いを誰かが説明できますか?

4

2 に答える 2

4

わあ、そのカーネルは、以前の MontaVista での雇用の初期の頃から、長い間使用されてきました! ここに簡単な答えがあるかどうかはわかりませんが、もしそれが私だったら、コンパイラの違いが気になるでしょう。Linux カーネルは、サイズが大きく複雑であることもあり、常にコンパイラのバージョンに敏感でした。カーネルは多くの GNU 拡張機能を使用しており、実際には、新しいコンパイラ ビルドに対して非常に優れたストレス テストを行います。

/proc/version の出力を見るだけで、カーネルを構築するためにどのコンパイラが使用されたかを知ることができます (これは 2.4.20 カーネルの時代からずっと前に存在していたと思いますが、それについては間違っている可能性があります)。プロセス/バージョン。これは確かに最新のカーネルで機能し、長い間カーネルに組み込まれています。

私の最初の提案は、カーネルをより最新のものにアップグレードすることですが、それは実際にはオプションではないと思います。;)

コンパイラの専門家 (私ではない) でさえ、「何が違うのか」という質問に答えるのに苦労すると思います。しかし、この簡単なテストを行ってください。モジュールを 3.4.1 でコンパイルし、次に 4.7 でコンパイルします。結果のオブジェクト (.ko ファイル) は確かに異なります。

現実には、バグはすべてのソフトウェアに存在し、バグを刺激する何かが現れるまで何年も潜んでいる可能性があります。この完璧な例については、私のブログ記事http://blogs.mentor.com/chrishallinan/blog/2012/05/18/fun-with-toolchain-versionsを参照してください。

それがあなたの問題だと言っているわけではありませんが、私のモジュールとカーネルの両方が同じコンパイラバージョンでコンパイルされていれば、ずっと気分が良くなると思います。

幸運を。

于 2012-09-02T17:32:12.217 に答える