このツールを使用して不要な依存関係を排除するために、開発サーバーから複数のライブラリにパッチを適用しています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を実行すると、奇妙なことはSONAME
1つもなく、すべて.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のバグであると仮定します。私たちはglibc
2012年頃からバージョン2.17を使用しているため、後者であると推測します。しかしpatchelf
、...おそらくELF規格が変更された可能性があります。
tl;dr patchelf バージョン 0.10 および glibc バージョン 2.17 では、 --add-needed オプションが ELF を台無しにし、ldconfig がいくつかの不安定なリンクを生成するように見えます。
ベストアンサー1
ldconfig
一部を変更した後(特にsonameまたはrpathの追加/変更/削除)、ELF形式を正しく読み取ることができるほどスマートです。
ライブラリ自体は完璧ですが、それはldconfig
問題です。