私はいくつかのライブラリ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]
)。これにより、最後に.dynamic
2 つのDT_NULL
エントリが残りますが、何も気にする必要はありません。
複雑なことの 1 つは、参照するバージョン管理されたシンボルがlibB.so
含まれている場合、テーブル内に追加の参照があり、これらを取り除くのがより困難になることです。参照を取り除かないと、動的リンカーはアサーションに失敗します。libA.so
libB.so
DT_VERNEED
VERNEED