2016-08-24 41 views
0

我可以打印一個導出的函數列表*像如何從lib .so文件找到函數?

nm -C lib/libopencv_ml.so

然後.so文件找到我的功能一樣

nm -C lib/libopencv_ml.so | grep myfunction

,但是當我想找到的所有功能。所以文件如何確定哪些.so包含我的功能?

這只是打印所有條目的功能,但我需要知道它從哪個.so文件出現。

nm -C lib/*.so | grep cvSetZero

似乎-H選項也沒有幫助。 -H, --with-filename print the file name for each match

nm -C lib/*.so | grep -Hn cvSetZero

生成輸出,如:

(standard input):98:     U cvSetZero 
(standard input):796:     U cvSetZero 
(standard input):2564:00000000000b2540 T cvSetZero 
(standard input):8673:     U cvSetZero 
(standard input):12233:     U cvSetZero 
(standard input):15503:     U cvSetZero 
(standard input):17460:     U cvSetZero 
(standard input):18727:     U cvSetZero 
(standard input):20865:     U cvSetZero 
+0

'for f in dir/*。so;做nm -C「$ f」| grep foo && echo「$ f」; done' –

回答

1

我找到了解決方案

nm -C -A lib/*.so | grep cvSetZero

它產生這種輸出:

lib/libopencv_calib3d.so:     U cvSetZero 
lib/libopencv_contrib.so:     U cvSetZero 
lib/libopencv_core.so:00000000000b2540 T cvSetZero 
lib/libopencv_highgui.so:     U cvSetZero 
lib/libopencv_imgproc.so:     U cvSetZero 
lib/libopencv_legacy.so:     U cvSetZero 
lib/libopencv_ml.so:     U cvSetZero 
lib/libopencv_objdetect.so:     U cvSetZero 
lib/libopencv_video.so:     U cvSetZero 
0

你可以添加一個最後:
| c++filt

爲了還原函數的符號。另外作爲一個通用的說明,gcc-nm應該用於用LTO編譯的系統中。

編輯:與nm另一種方法是使用-D--defined-only和重定向可能出現的錯誤,以/dev/nullgrep確切符號與'\bsymbol_name\b'後。

$ nm -Dn -o --defined-only /lib/* /usr/lib64/* 2> /dev/null | grep '\bprintf\b' 
/lib/libc-2.26.so:0000000000058ee0 T printf 
/lib/libc.so.6:0000000000058ee0 T printf 

這種方法可以搜索定義symbol_name的庫,而不僅僅是使用它。 -D允許僅在動態庫(.so)中進行搜索。

不過是似乎掃描庫定義(+)或不是最終辦法( - )的象徵,也是scanelf

$ scanelf -qRys +printf /lib64/ 
printf /lib64/lib/clang/3.7.0/lib/linux/libclang_rt.asan-i386.so 
printf /lib64/lib/clang/3.7.0/lib/linux/libclang_rt.asan-x86_64.so 
printf /lib64/lib/gcc/x86_64-pc-linux-gnu/5.4.0/libasan.so.2.0.0 
printf /lib64/lib/gcc/x86_64-pc-linux-gnu/5.4.0/libtsan.so.0.0.0 
printf /lib64/lib/gcc/x86_64-pc-linux-gnu/5.4.0/32/libasan.so.2.0.0 
printf /lib64/libc-2.26.so 
$ scanelf -qRys -printf /lib64/ 
printf /lib64/lib/ConsoleKit/ck-collect-session-info 
printf /lib64/libnsl-2.26.so 

-m選項上/搜索整個系統運行scanelf,無穿越安裝點。

相關問題