共有ライブラリシンボルの競合を見つけるためのツールはありますか?

共有ライブラリシンボルの競合を見つけるためのツールはありますか?

私が書いているソフトウェアのいくつかがクラッシュを起こしていますが、2つの異なる共有ライブラリ間のシンボリッククラッシュが原因であると思われます(共有ライブラリの1つを無効にするともう1つが機能し始めます)。

プログラムによってロードされたライブラリを表示し、複数のライブラリに定義されたシンボルがあるかどうかを知るために使用できるツールはありますか?

ベストアンサー1

問題を解決するためにシェルスクリプトに使用できるいくつかの一般的なユーティリティがあります(問題を解決するためにそれらを組み合わせたスクリプトを見たことはありませんが)。これnmオブジェクトファイルまたは実行可能ファイルからシンボルを検索するユーティリティです。ほとんどのシステムではlddotoolmacOSの場合)実行可能ファイルで使用されている共有ライブラリを表示します。たとえば、前者のスクリプト(listused.sh)は、ncursesがライブラリ内のすべてのシンボルとそのライブラリを使用するプログラムでこれらのシンボルをテストできるかどうかを示します(参照)レポート存在するtest/README)。

この-Cオプションは便利ですが(C ++ライブラリに興味がある場合)、これらのライブラリは剥がれた(デバッグ情報がありません。)しかし、-Dオプション(「最新」システム、つまり過去10〜15年間に更新されたほとんどすべてのシステムで利用可能)は、次の記号を提供します。動的図書館:

一般記号の代わりに動的記号を表示します。これは、特定の種類の共有ライブラリなどの動的オブジェクトにのみ適しています。

動的記号のみが表示されます。このオプションは共有ライブラリにのみ適しています。

シンボル情報を表示しますSHT_DYNSYM。これはld.so.1で使用されるシンボルテーブルであり、削除された動的実行可能ファイルにも存在します。もし–D指定しない場合、デフォルトの動作はSHT_SYMTABシンボル情報を表示することです。

少なくともその文書によると、これは最新システムの機能ではありません。

(誰かがこの機能の導入スケジュールをすぐに知ることができます。)

私はいくつかのスクリプトでこの機能を使用しました。analyze-curses-symbols

追加資料:

-quickstart_infoオプションを使用すると、競合が発生したときにldが通知します。また、競合を見つけるには、-Dcオプションを指定してelfdumpを実行するように求められます。 elfdumpから生成された出力を読み取る方法の詳細については、elfdump(1)のマニュアルページを参照してください。

  • しかし、elfdumpは標準化されていません(でもnm例)そして-Dc他の実装では見つかりません。これ、Solarisの場合。 (持っている関連Solaris用プログラム)。

おすすめ記事