ldconfigはpatchelfを使用してライブラリにパッチを適用した後に奇妙な名前のリンクを生成しますか?

ldconfigはpatchelfを使用してライブラリにパッチを適用した後に奇妙な名前のリンクを生成しますか?

このツールを使用して不要な依存関係を排除するために、開発サーバーから複数のライブラリにパッチを適用していますpatchelf。 RPM でパッケージ化され、ランタイムシステムにインストールされます。インストール後にldconfig呼び出され、奇妙なリンクが生成されます。

ランタイムシステムでパッチを適用したライブラリの場所は、/usr1/blah/lib複数のサブフォルダのように見えます。サブフォルダの場所と場所は/etc/ld.so.conf私のファイルに割り当てられます。実行すると、ldconfig次のような奇妙な名前のリンクがたくさん生成されます。

?N -> libFoo.so

??r? -> libBar.so

そして、名前がライブラリ内の関数の関数名の一部であるリンク、たとえばこれを行い、関数名を見ると、リンクobjdump -xは関数の一部を名前にします。

私の理解は、ldconfigがSONAMEライブラリ名を見てその名前でリンクを作成することです。ただし、objdump -x影響を受けたすべてのライブラリに対してanとgrepを実行すると、奇妙なことはSONAME1つもなく、すべて.soで終わり、奇妙な疑問符もありません。

ldconfig -v有用な情報は提供されません。

何が起こっているのかというアイデアはありますか?たぶんSONAME私が何かを逃しているのではないでしょうか?助けてくれてありがとう。

編集:パッチプロセスの一部として依存関係を削除した場合(たとえば、呼び出しだけではこの問題は発生しません。)この問題は、そのpatchelf --remove-needed <dependency> <lib name>フラグを使用した場合にのみ発生します。--add-needed

編集2:ジャンク依存関係を追加して削除すると(直後patchelf --add-needed garbage libFoo.soに)、patchelf --remove-needed garbage libFoo.so奇妙な接続の問題が発生します。各ライブラリの最終依存関係リストはまったく同じであり、--remove-neededそのフラグを使用するときに機能するため、問題はその--add-neededフラグとpatchelfヘッダーで実行されるすべての操作にあると考えられます。

編集3:この時点では、これがpatchelfまたはldconfigのバグであると仮定します。私たちはglibc2012年頃からバージョン2.17を使用しているため、後者であると推測します。しかしpatchelf、...おそらくELF規格が変更された可能性があります。

tl;dr patchelf バージョン 0.10 および glibc バージョン 2.17 では、 --add-needed オプションが ELF を台無しにし、ldconfig がいくつかの不安定なリンクを生成するように見えます。

ベストアンサー1

ldconfig一部を変更した後(特にsonameまたはrpathの追加/変更/削除)、ELF形式を正しく読み取ることができるほどスマートです。

ライブラリ自体は完璧ですが、それはldconfig問題です。

おすすめ記事