2012-08-13 8 views
5

現在、Linux C++プロジェクトを含む大量のコード用にビルドシステムを更新しています。ここにいる開発者のすべてが自分のアイデアでハッキングするとビルドを実行できればいいと思うので、ターゲットシステムが2.6.18であるにもかかわらず、現代的でない現代的なLinuxシステムでこれを構築することが可能かどうかを検討していました。GCC/G ++:古いLinuxカーネルのためのGNUユニークなオブジェクトシンボルなしのビルド

「漠然とモダンな」GCC 4.5+のようなものを推測しています。これは、過去1〜2年の流通が来るかもしれないということです。現在、私は静的にコンパイルすることでlibstdC++の問題を解決しています。glibcの問題は、古いバージョンのmemcpyシンボル(など)をラッパーコードで再マッピングすることできちんと修正されています。ここまでは順調ですね。

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

G ++をコンパイルするときにGNU固有のオブジェクトの使用を無効にすることはできますが、これは最も便利な解決策ではありません。私は、コードをコンパイルするときにそれを無効にする方法は全く見当たりません。(distro gcc/g ++は常にこのオプションをオンにしています)、ld-linuxとカーネルをアップデートすることをターゲットシステムに認識させる唯一の方法を想像します。それはほぼ確実に起こることはありません。

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

+0

これがダイナミックリンクシンボルタイプの場合、カーネルではなくダイナミックリンカに問題があるはずです。これはカーネルとどう関係していますか? – Hibou57

+0

私はそれを試していませんが、私はカーネルを変更せずにlibldを変更することは、まったく可能なら、かなり難しいと思っています。カーネルには直接関係しませんが、カーネルを再コンパイルしたり、OS全体をアップグレードしてリンカにこれらの他のシンボルを認識させなければならないという事実を理解しています。 – rhickman

答えて

4

私は同じ問題(これは私にこの質問を見つけることにつながった)に対処しようとしていました。そして、たくさんの研究が決定的な結論に達しました。何も欠けていない、あなた自身のg ++​​。 GCC-ヘルプメーリングリストでこの最近の質問を参照してください:

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

私はgccのソースを比較し、ユニークなシンボルが4.5で追加されたとして、あなたが、株式4.4と高く行くことができることを見出しました。しかし、RHEL/CentOS 6ではデフォルトで4.4になっていますが、ユニークなシンボルサポートがパッチされていますので、通常は配布固有のgccバージョンに注意する必要があります。 RHEL 6でコンパイルされたものは、gcc 4.4 + RHEL 5用に作られたlibstdC++のコピーであっても、RHEL 5上で実行することはできないという意味です。

ここでは、あなたは、人々が様々な理由のために他のリストにそれについて不平を言っていることがわかります、あなたの周りに検索する場合は

http://www.redhat.com/archives/posix-c++-wg/2009-August/msg00002.html

、私はそれがここに滞在するだと思う:サポートによって、発表されました。

+0

お返事ありがとうございます。私はちょうどLinuxカーネルをアップグレードすることについて大声で訴える必要があります:) – rhickman

関連する問題