既存のシステムをWindowsからLinuxに移植しています。ビルドは複数の静的ライブラリで構成されています。libBのオブジェクトにシンボル(libAで定義)が見つからないというリンクエラーが発生しました。リンカーラインは次のようになりました
g ++ test_obj.o -lA -lB -o test
もちろん問題は、リンカがlibAからのシンボルを必要としていることを検出するまでに、すでにそれを通過しており、再スキャンしないため、シンボルが取得のために存在していても、単にエラーになることです。
私の最初のアイデアはもちろん、リンクを(-lB -lAに)スワップして、後でlibAをスキャンし、libAにあるlibBから欠落しているシンボルをピックアップすることでした。しかし、実際にはlibAとlibBの間に再帰的な依存関係があることがわかりました。Visual C ++リンカーがこれを何らかの方法で処理すると想定しています(デフォルトで再スキャンされますか?)。
私が検討したこれに対処する方法:
共有オブジェクトを使用します。残念ながら、これはPICコンプライアンスを要求するという観点からは望ましくなく(これはパフォーマンスに敏感なコードであり、GOTを保持するために%ebxを失うと本当に害があります)、共有オブジェクトは必要ありません。
問題を回避して、すべてのオブジェクトの1メガarを構築します。
再帰的な依存関係を回避するためにコードを再構築します(これは明らかに正しいことですが、最小限の変更でこのポートを実行しようとしています)。
これに対処する他のアイデアはありますか?binutilsリンカーに、シンボルが欠落しているときにすでに調べたライブラリの再スキャンを実行するように説得する方法はありますか?