私はサードパーティのライブラリAを持っています。これにはライブラリが必要ですB は、静的バージョンBにリンクされているbinraryにリンクされています。 したがって、動的バージョンのBの必要はありません。elfファイルのダイナミックセクションからエントリを削除する
は私のコントロール下になく、再コンパイルできません。だから私はセクションAからNEEDED libA
のエントリを削除したいと思います。
objcopyや他のツールで行う方法はありますか?
私はサードパーティのライブラリAを持っています。これにはライブラリが必要ですB は、静的バージョンBにリンクされているbinraryにリンクされています。 したがって、動的バージョンのBの必要はありません。elfファイルのダイナミックセクションからエントリを削除する
は私のコントロール下になく、再コンパイルできません。だから私はセクションAからNEEDED libA
のエントリを削除したいと思います。
objcopyや他のツールで行う方法はありますか?
objcopyや他のツールで行う方法はありますか?
elfshは可能かもしれませんが、これを行うことができる既存のツールはありません。
あなたが欲しいものを行うには、Cプログラムを書くことは非常に簡単です:libA.so
の.dynamic
部分は.d_type == DT_NULL
のエントリによって終了(タイプElfW(Dyn)
の)固定長レコードのテーブルです。特定のDT_NEEDED
エントリを取り除くには、次のエントリをすべて「上書き」するだけです(entry[n]
を上書きします。entry[n+1]
など)。これにより、.dynamic
の最後に2つのDT_NULL
エントリが残されますが、何も気にする必要はありません。
一つの合併症はlibB.so
がバージョン管理シンボルlibA.so
の参照が含まれている場合は、DT_VERNEED
テーブルにlibB.so
への追加の参照が存在することがあり、これらは取り除くことがより困難です。 VERNEED
の参照を取り除かないと、ダイナミックリンカはアサーションに失敗します。
確率が90%以上であれば、必要な項目を削除すると、解決できないシンボルエラー(運がよければ)または誤動作しているプログラム(ユニークでなければならないデータが重複しているため、 )。代わりに、ライブラリBの動的バージョンに対してバイナリを再リンクする必要があります。 – zwol
@ ZackバイナリをBの静的バージョンとリンクするので、未解決のシンボルは存在しません。私はまだ問題があると思いますか? – dimba
はい。バイナリには、バイナリ自体が使用するBのサブセットのみが含まれています。これは、Aにとっても十分ではない可能性が非常に高いです。 Bの動的バージョンとリンクするのはなぜ問題なのですか? – zwol