2016-08-24 14 views
0

я могу напечатать список экспортируемой функции одного * .so файл какКак найти функцию из файлов lib .so?

nm -C lib/libopencv_ml.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; do 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

, чтобы demangle символы. Также как общая нота, gcc-nm следует использовать в системе, скомпилированной с LTO.

EDIT: Еще один способ с nm заключается в использовании -D и --defined-only и после редиректа возможных ошибок в /dev/null, grep символа в точной с '\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 

Этот способ позволяет искать библиотеку, которая определяет имя_имя, а не просто использует его. -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 

Run scanelf с -m опции/искать всю систему, без пересечение точек крепления.

 Смежные вопросы

  • Нет связанных вопросов^_^