現在、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のインストールやソースからのビルドを意味します。
これがダイナミックリンクシンボルタイプの場合、カーネルではなくダイナミックリンカに問題があるはずです。これはカーネルとどう関係していますか? – Hibou57
私はそれを試していませんが、私はカーネルを変更せずにlibldを変更することは、まったく可能なら、かなり難しいと思っています。カーネルには直接関係しませんが、カーネルを再コンパイルしたり、OS全体をアップグレードしてリンカにこれらの他のシンボルを認識させなければならないという事実を理解しています。 – rhickman