2013-01-23 15 views
5

私はサードパーティのライブラリAを持っています。これにはライブラリが必要ですB は、静的バージョンBにリンクされているbinraryにリンクされています。 したがって、動的バージョンのBの必要はありません。elfファイルのダイナミックセクションからエントリを削除する

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

objcopyや他のツールで行う方法はありますか?

+1

確率が90%以上であれば、必要な項目を削除すると、解決できないシンボルエラー(運がよければ)または誤動作しているプログラム(ユニークでなければならないデータが重複しているため、 )。代わりに、ライブラリBの動的バージョンに対してバイナリを再リンクする必要があります。 – zwol

+0

@ ZackバイナリをBの静的バージョンとリンクするので、未解決のシンボルは存在しません。私はまだ問題があると思いますか? – dimba

+0

はい。バイナリには、バイナリ自体が使用するBのサブセットのみが含まれています。これは、Aにとっても十分ではない可能性が非常に高いです。 Bの動的バージョンとリンクするのはなぜ問題なのですか? – zwol

答えて

1

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の参照を取り除かないと、ダイナミックリンカはアサーションに失敗します。

関連する問題