нм будет работать, только если библиотека не лишена своих символов.Тем не менее, nm -D
может показать вам некоторую информацию:
nm -D /lib/libgcc_s.so.1
Но есть еще один инструмент, который может вам помочь: readelf
readelf - отображает информацию оELF-файлы.
А если вы проверите справочные страницы, опция -s : Displays the entries in symbol table section of the file, if it has one.
readelf -s /lib/libgcc_s.so.1
РЕДАКТИРОВАТЬ:
Ну, символы, которые не реализованы внутри объекта, который вы проверяете с помощью nm, появятся с флагом U перед ним, но nm не скажет вам, какая библиотека в вашей системереализует этот символ.
Так что то, что вы ищете, может быть достигнуто с помощью смеси ldd и nm .ldd сообщает, с какими библиотеками связано ваше приложение, а nm сообщает, какие символы не определены ( U flag) или реализованы локально ( T flag).
После перечисления всехнеопределенные символы (с nm) в целевом приложении, вы должны перебирать все библиотеки, о которых сообщает ldd, в поисках этих символов (снова используя nm).Если вы нашли символ и ему предшествует флаг T, вы его нашли.
Кстати, я просто написал этот однострочный для bash , чтобы проиллюстрировать мою идею.Он анализирует приложение с именем win и пытается найти библиотеки, которые реализуют все символы, указанные как неопределенные.
target="win"; for symbol in $(nm -D $target | grep "U " | cut -b12-); do for library in $(ldd $target | cut -d ' ' -f3- | cut -d' ' -f1); do for lib_symbol in $(nm -D $library | grep "T " | cut -b12-); do if [ $symbol == $lib_symbol ]; then echo "Found symbol: $symbol at [$library]"; fi ; done; done; done;
Или, если ваш терминал поддерживает цвета:
target="win"; for symbol in $(nm -D $target | grep "U " | cut -b12-); do for library in $(ldd $target | cut -d ' ' -f3- | cut -d' ' -f1); do for lib_symbol in $(nm -D $library | grep "T " | cut -b12-); do if [ $symbol == $lib_symbol ]; then echo -e "Found symbol: \e[1;36m$symbol\033[0m at \e[1;34m$library\033[0m"; fi ; done; done; done;
Я уверен, что кто-то найдет улучшение производительности.
Выходы:
Found symbol: XCreateColormap at [/usr/lib/libX11.so.6]
Found symbol: XCreateWindow at [/usr/lib/libX11.so.6]
Found symbol: XIfEvent at [/usr/lib/libX11.so.6]
Found symbol: XMapWindow at [/usr/lib/libX11.so.6]
Found symbol: XOpenDisplay at [/usr/lib/libX11.so.6]
Found symbol: __libc_start_main at [/lib/tls/i686/cmov/libc.so.6]
Found symbol: __stack_chk_fail at [/lib/tls/i686/cmov/libc.so.6]
Found symbol: glClear at [/usr/lib/mesa/libGL.so.1]
Found symbol: glClearColor at [/usr/lib/mesa/libGL.so.1]
Found symbol: glFlush at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXChooseFBConfig at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXChooseVisual at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXCreateContext at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXCreateNewContext at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXCreateWindow at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXGetVisualFromFBConfig at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXMakeContextCurrent at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXMakeCurrent at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXQueryVersion at [/usr/lib/mesa/libGL.so.1]