私は現在、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インストールまたはソースからのビルドを意味します。