6

私は現在、LinuxC++プロジェクトを含む大量のコードのビルドシステムの更新に取り組んでいます。ここにいるすべての開発者が自分のアイデアをハッキングするときにビルドを実行できればいいので、ターゲットシステムが2.6.18であるにもかかわらず、漠然と最新のLinuxシステムでこれをビルドできるかどうかを検討していました。

「漠然と現代的」とは、GCC 4.5+のようなものを推定しています。これは、過去1〜2年のディストリビューションに付属している可能性があります。現在、libstdc ++の問題を静的にコンパイルすることで解決しています。また、glibcの問題は、ラッパーコードを少し使用して古いバージョンのmemcpyシンボル(など)に再マッピングすることで適切に回避されています。ここまでは順調ですね。

私が完全に理解できない1つの問題は、.oファイルから実行可能ファイルに組み込まれた特定のシンボルがタイプ'u'であるということです。これは、GNU固有のオブジェクトであり、2.6.18にはないELF標準の拡張です。まったく認識していないようです。これは、シンボルが実際には存在しているにもかかわらず、シンボルが見つからないために実行可能ファイルが実行されないことを意味します(ターゲット上で「nm」から「?」と入力するだけです)。

G ++をコンパイルするときにGNU固有のオブジェクトの使用を無効にすることはできますが、それは必ずしも最も便利なソリューションではありません。コードをコンパイルするときにそれを無効にする方法がわかりません(ディストリビューションgcc / g ++では常にこのオプションがオンになっています)。ターゲットシステムにそれを認識させる唯一の方法は、ld-linuxとカーネルを更新することだと思います。 。それはほぼ確実に起こらないでしょう。

これらのシンボルタイプを無効にするために私が見つけていないオプションはありますか?それとも、これを回避するためのいくつかのきちんとした方法、または私が見逃している何かがありますか?G ++ 4.1.xでコンパイルする必要があるのではないかと思い始めています。これは、古いLinuxインストールまたはソースからのビルドを意味します。

4

1 に答える 1

7

私は同じ問題に対処しようとしていました(この質問を見つけることにつながりました)。一連の調査の結果、いいえ、何も欠けていないという決定的な結論に達した後、独自のg ++​​をコンパイルする以外にこれを回避する方法はありません。gcc-help メーリング リストで、この最近の質問を参照してください。

http://gcc.gnu.org/ml/gcc-help/2013-01/msg00008.html

gcc ソースを比較したところ、4.5 で固有のシンボルが追加されたため、ストック 4.4 まで上げることができることがわかりました。ただし、RHEL/CentOS 6 では、デフォルトで 4.4 に設定されていますが、固有のシンボル サポートにパッチが適用されているため、通常どおり、ディストリビューション固有の gcc バージョンに注意する必要があります。gcc 4.4 + RHEL 5 専用に作成された libstdc++ のコピーを使用しても、RHEL 6 でコンパイルされたものは RHEL 5 で実行できないことを意味するため、私にとってこれは非常に残念なことです。

ちなみに、ユニークシンボルのサポートが最初に提案されたメッセージは次のとおりです。

https://gcc.gnu.org/ml/gcc-patches/2009-07/msg01240.html

いろいろ調べてみると、他のリストでもさまざまな理由で不満を漏らしている人がいることがわかりますが、ここには残っていると思います.

于 2013-03-24T23:55:05.180 に答える