私はいくつかのライブラリBを必要とするサードパーティのライブラリAを持っています。 Aはバイナリにリンクされており、静的バージョンBにリンクされています。したがって、 Bの動的バージョンはもう必要ありません。
Aは私の管理下になく、再コンパイルできません。したがって、 A のDYNAMICセクションNEEDED libAからエントリを削除したいと思います。
objcopy または他のツールでそれを行う方法はありますか?
私はいくつかのライブラリBを必要とするサードパーティのライブラリAを持っています。 Aはバイナリにリンクされており、静的バージョンBにリンクされています。したがって、 Bの動的バージョンはもう必要ありません。
Aは私の管理下になく、再コンパイルできません。したがって、 A のDYNAMICセクションNEEDED libAからエントリを削除したいと思います。
objcopy または他のツールでそれを行う方法はありますか?
objcopy または他のツールでそれを行う方法はありますか?
これを実行できる既存のツールは知りませんが、elfshは実行できる可能性があります。
必要なことを行う C プログラムを作成するのは非常に簡単です。 の.dynamicセクションlibA.soは固定サイズのレコード (タイプElfW(Dyn))のテーブルで、 .d_type == DT_NULL. 特定のDT_NEEDEDエントリを削除するには、後続のすべてのエントリを上に「スライド」するだけです ( などで上書きentry[n]しますentry[n+1])。これにより、最後に.dynamic2 つのDT_NULLエントリが残りますが、何も気にする必要はありません。
複雑なことの 1 つは、参照するバージョン管理されたシンボルがlibB.so含まれている場合、テーブル内に追加の参照があり、これらを取り除くのがより困難になることです。参照を取り除かないと、動的リンカーはアサーションに失敗します。libA.solibB.soDT_VERNEEDVERNEED