私が書いているソフトウェアのいくつかがクラッシュを起こしていますが、2つの異なる共有ライブラリ間のシンボリッククラッシュが原因であると思われます(共有ライブラリの1つを無効にするともう1つが機能し始めます)。
プログラムによってロードされたライブラリを表示し、複数のライブラリに定義されたシンボルがあるかどうかを知るために使用できるツールはありますか?
ベストアンサー1
問題を解決するためにシェルスクリプトに使用できるいくつかの一般的なユーティリティがあります(問題を解決するためにそれらを組み合わせたスクリプトを見たことはありませんが)。これnm
オブジェクトファイルまたは実行可能ファイルからシンボルを検索するユーティリティです。ほとんどのシステムではldd
(otool
macOSの場合)実行可能ファイルで使用されている共有ライブラリを表示します。たとえば、前者のスクリプト(listused.sh
)は、ncursesがライブラリ内のすべてのシンボルとそのライブラリを使用するプログラムでこれらのシンボルをテストできるかどうかを示します(参照)レポート存在するtest/README
)。
この-C
オプションは便利ですが(C ++ライブラリに興味がある場合)、これらのライブラリは剥がれた(デバッグ情報がありません。)しかし、-D
オプション(「最新」システム、つまり過去10〜15年間に更新されたほとんどすべてのシステムで利用可能)は、次の記号を提供します。動的図書館:
- GNUバイナリチル、1999年から
一般記号の代わりに動的記号を表示します。これは、特定の種類の共有ライブラリなどの動的オブジェクトにのみ適しています。
- ELFツールチェーン、2008年から
動的記号のみが表示されます。このオプションは共有ライブラリにのみ適しています。
シンボル情報を表示します
SHT_DYNSYM
。これはld.so.1で使用されるシンボルテーブルであり、削除された動的実行可能ファイルにも存在します。もし–D
指定しない場合、デフォルトの動作はSHT_SYMTAB
シンボル情報を表示することです。
少なくともその文書によると、これは最新システムの機能ではありません。
(誰かがこの機能の導入スケジュールをすぐに知ることができます。)
私はいくつかのスクリプトでこの機能を使用しました。analyze-curses-symbols
。
追加資料:
- 共有ライブラリシンボルの競合(Linux)この目的でこれを使用する方法を示す例を提供してください
nm
。 - 第3章動的共有オブジェクトの使用以前のSGIマニュアルには
elfdump
関連オプションがあると言われています。
-quickstart_infoオプションを使用すると、競合が発生したときにldが通知します。また、競合を見つけるには、-Dcオプションを指定してelfdumpを実行するように求められます。 elfdumpから生成された出力を読み取る方法の詳細については、elfdump(1)のマニュアルページを参照してください。