背景
llvm や tensorflow など, たくさん .so, .a などがあるプロジェクトで, どのライブラリにどのシンボルが定義されているか調べたい(リンクで必要なライブラリをリストアップするなど用).
環境は Linux とする.
方法
こんな感じになりました.
$ find ./ -name "*.a" -print | xargs nm -A | c++filt | grep -e 'tensorflow::GraphDef::~GraphDef' | grep T
- find でまずはファイルを列挙
- xargs でそれぞれのファイルに対して nm をよぶ. このとき
-A
をつけておくとファイル名を表示してくれる - c++filt でシンボルのデマングルを行う
- あとは grep し, シンボルが
T
になっているものを探す(T
= 実体が定義されている)
TODO
- シンボルが strip された .a or .so だと動かない. この場合readelf あたりでいけるか?