同じベンダーの2つのサードパーティライブラリを統合するときに、これを解決する必要がありました。両方のライブラリは同じシンボル名のいくつかを使用しましたが、それらは互いに互換性がありませんでした。これらはベンダーからのものであったため、検索して置き換える余裕はありませんでした。また、(a)2つのライブラリが同じタスクから呼び出される可能性があり、(b)重複シンボルの一部が関数であったため、タスク変数も適用できませんでした。
それぞれlib1とlib2にリンクされたapp1とapp2があると仮定します。両方のライブラリは同じシンボルを定義するため、互いに非表示にする必要があります。
幸い(GNUツールを使用している場合)objcopyを使用すると、リンク後に変数のタイプを変更できます。
これがソリューションのスケッチです。必要に応じて変更する必要があります。
まず、app1の部分リンクを実行してlib1にバインドします。ここでは、app1の*.oがapp1_tmp1.oにすでに部分的にリンクされていることを前提としています。
$(LD_PARTIAL) $(LDFLAGS) -Wl,-i -o app1_tmp2.o app1_tmp1.o $(APP1_LIBS)
次に、作成したtmp2オブジェクトのlib1からすべてのシンボルを非表示にして、app1の「実際の」オブジェクトを生成します。
objcopymips `nmmips $(APP1_LIBS) | grep ' [DRT] ' | sed -e's/^[0-9A-Fa-f]* [DRT] /-L /'` app1_tmp2.o app1.o
app2に対してこれを繰り返します。これで、app1.oとapp2.oを、競合することなく最終的なアプリケーションにリンクする準備が整いました。
このソリューションの欠点は、ホストシェルからこれらのシンボルにアクセスできないことです。これを回避するには、デバッグのためにライブラリのいずれかを非表示にするシンボルを一時的にオフにします。