Ответ 1
nm будет работать только в том случае, если библиотека не была лишена его символов. Однако 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
EDIT:
Ну, символы, которые не реализованы внутри объекта, который вы просматриваете с помощью nm, будут отображаться с флагом U перед ним, но nm не скажет, какая библиотека в вашей системе реализует эту символ.
То, что вы ищете, возможно, может быть достигнуто с помощью комбинации ldd и nm. ldd сообщает, с какими библиотеками связано ваше приложение, а nm указывает, что символы undefined (U) или реализованы локально ( T).
После перечисления всех символов undefined (с nm) в целевом приложении вы должны перебирать все библиотеки, о которых сообщает ldd, в поисках этих символов (с использованием nm снова). Если вы найдете символ и ему предшествует флаг T, вы его нашли.
Кстати, я просто написал этот однострочный для bash, чтобы проиллюстрировать мою идею. Он анализирует приложение с именем win и пытается найти библиотеки, которые реализуют все символы, обозначенные как undefined.
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]