Как найти функцию из файлов lib .so?

Я могу напечатать список экспортируемых функций одного *.so файла, например

nm -C lib/libopencv_ml.so

а потом найди мою функцию как

nm -C lib/libopencv_ml.so | grep myfunction

но когда я хочу найти функцию из всех.so файлов, как определить, какие.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

2 ответа

Я нашел решение

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

Вы можете добавить один последний:
| c++filt

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

РЕДАКТИРОВАТЬ: Другой способ с 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

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

Другие вопросы по тегам