HOW-TO: использование команд truss, ldd и nm для наблюдения ...Solaris 10: советы и приёмы системного администрирования |
|
Sponsored LinksКатегорииLinksUnix Tutorial
Personal Development Ruslan Valiev Solaris Performance Team Damien Farnham Fintan Ryan Nicky Veitch Niall Mullen Sean McGrath DTrace Bryan Cantrill Brendan Gregg ZFS Tim Foster General Ben Rockwood Learning Solaris 10 Privacy policy |
Friday, 3 March. 2006
Добавил Gleb Reys
в категории SysAdmin
Комментарии (10) Обратные ссылки (0) Select language: English
HOW-TO: использование команд truss, ldd и nm для наблюдения исполняемых файлов
Решил записать сюда пару полезных советов по поводу исследования исполняемых файлов в Solaris. Указанные выше команды доступны, начиная с Solaris 8, так что надеюсь, что вам эти приёмы работы пригодятся. Очень часто случается так, что программы не работают так, как мы ожидаем, а иногда и вовсе отказываются запускаться, выдавая ошибки вроде "referenced symbol not found" (не найден символ в одной из библиотек) или что-нибудь вроде: ld.so.1: ./thunderbird-bin: fatal: libmozjs.so: open failed: No such file or directoryТак вот, для того, чтобы точно разобраться, какими библиотеками пользуется та или иная программа, где она ожидает их найти, и что же всё-таки не находится, следует выполнить следующие шаги: 1) Сначала нужно посмотреть, какие библиотеки линковщик ld будет использовать для конкретного бинарного файла. Например, вот так можно увидеть, какие библиотеки используются исполняемым файлом почтового клиента Thunderbird: bash-3.00$ ldd thunderbird-binКак всегда в моих примерах, вывод команды ldd приведён не полным в целях экономии места. Но суть уже ясна. Понятно, что один из файлов - библиотека libmozjs.so - не находится. Это значит, что его нет ни в одном стандартном пути поиска библиотек линковщиком ld, и так же этого файла нету в текущем каталоге. 2) Теперь нужно определить, где линковщик ожидает найти этот самый libmozjs.so файл. Для этого мы воспользуемся командой truss. Всё, что нас интересует - это системные вызовы stat и open. stat используется для проверки нахождения файлов, а open - соответственно, открывает файлы для последующего к ним доступа. bash-3.00$ truss -f -t stat,open ./thunderbird-binОчень хорошо видно, как линковщик последовательно перебирает стандартные пути в поисках каждой библиотеки. И для libmozjs.so мы видим, что по логике вещей этот файл должен был быть в каталоге /export/soft/thunderbird. Его там нету, потому что я для этой демонстрации его специально переименовал. А вот так будет выглядеть ldd, когда файл оказывается на месте: bash-3.00$ ldd thunderbird-binТ.е. как раз из /export/soft/thunderbird/libmozjs.so эта библиотека и берётся. Таким образом, комбинацией команд ldd и truss можно совершенно однозначно определить, какие библиотеки, откуда и в каком порядке читаются исполняемым файлом, за которым вы наблюдаете. 3) Для случаев с ошибками "referenced symbol not found", нужно сделать ещё один дополнительный шаг. Ошибки эти происходят чаще всего потому, что библиотека, искомая исполняемым файлом, линковщиком находится, но не содержит всех функций, которые линковщик ожидает в ней найти. Так что после пунктов 1 и 2 этого руководства, как только мы точно узнаем, какой именно файл используется для каждой подгружаемой библиотеки, мы можем воспользоваться командой nm. Во многих библиотеках хранятся тысячи доступных процедур, поэтому правильнее всего будет использовать grep с указанием частичного названия процедуры, которую ваша программа не находит в библиотеке. Например, данная команда показывает все процедуры, доступные из библиотеки libgdk-x11-2.0, начинающиеся на gdk_threads: bash-3.00$ nm /usr/lib/libgdk-x11-2.0.so.0 | grep gdk_threadsСоответственно, если вы получаете ошибку "referenced symbol not found", часто это просто потому, что используется неверная версия библиотеки - более старая, или слишком новая, и нужные процедуры в ней либо отсутствуют, либо носят другие названия. Ну, я думаю всё. Если вдруг у кого-то есть дополнения к этому небольшому руководству, то милости прошу комментировать. Буду очень рад узнать ваше мнение! Обратные ссылки
URI этой записи для создания обратных ссылок (trackback)
Нет обратных ссылок
Комментарии
Показывать комментарии
(Как список | Древовидной структурой)
Hi
Thanks for this very important and useful information. Thanks Rajesh Kaushal
Always a pleasure, Rajesh!
All the best! Gleb |




