5

私はいくつかのライブラリBを必要とするサードパーティのライブラリAを持っています。 Aはバイナリにリンクされており、静的バージョンBにリンクされています。したがって、 Bの動的バージョンはもう必要ありません。

Aは私の管理下になく、再コンパイルできません。したがって、 A のDYNAMICセクションNEEDED libAからエントリを削除したいと思います。

objcopy または他のツールでそれを行う方法はありますか?

4

1 に答える 1

1

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

于 2013-01-25T07:07:04.880 に答える