1

競合する SONAME を持つライブラリの 2 つの既存のバージョンと互換性があるようにバイナリをリンクする方法は? これら 2 つのバージョンは、同じ SONAME プレフィックスを共有していません。1 つは libcapi10.so.3 で、もう 1 つは libcapi10.so.4 です。それらをバイナリとして取得しているため、再コンパイルできません。これらは認定された暗号ライブラリであるため、正しい SONAME で新しいライブラリを要求することはできません。もちろん、1 つが libcap10.so.3 で、もう 1 つが libcap10.so.3.1 の場合、2 つ目と互換性を持たせるために最初のものをリンクするだけでよいため、問題に直面することはありませんでした。これらの 2 つのライブラリは、バイナリ互換性があると言われています (この情報を信頼する必要があります)。検索しましたが、リンカー オプションまたは objcopy を使用して、適切な方法が見つかりませんでした。コンパイルのリンク時に使用するために手動でバイナリにパッチを適用することは避けたいと思います。

最初の質問に戻ります: リンクに使用する SONAME (この場合は libcap10.so) を指定するにはどうすればよいですか?

(私はすでに検索しましたが、私の現在の調査結果は、それがうまくいかないということですが、残念ながらこれは要件です...)。

更新: libcapi10.so.6\0 を libcapi10.so\0 に置き換えるバイナリ sed のようなツールを使用して .so ライブラリにパッチを適用しました。 0 を指定し、その elf チェックサムは gcc リンク中に使用されません。そのパッチを適用したライブラリをコンパイル時にのみ使用したので、ターゲット システムで同じバイナリを使用して、どちらか一方の元のライブラリを使用できます。

4

2 に答える 2

0

私の現在の最良の答えは、私のニーズを満たすことを可能にします。

libcapi10.so.6\0 を libcapi10.so\0 に置き換えるバイナリ sed のようなツールを使用して .so ライブラリにパッチを適用しました。 0 であり、その elf チェックサムは gcc リンク中に使用されません。そのパッチを適用したライブラリをコンパイル時にのみ使用したので、ターゲット システムで同じバイナリを使用して、どちらか一方の元のライブラリを使用できます。

そこで見つかったstackverflowの最高のヒント: 共有ライブラリに依存するプログラムを構築した後、共有ライブラリのファイル名を変更するにはどうすればよいですか?

于 2013-03-02T09:21:00.613 に答える