Категории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 Архивы |
Tags related to tag howtoThursday, 8 June. 2006
Руководства how-to по ... Добавил Gleb Reys
в категории Solaris в
01:01Комментарии (13) Обратные ссылки (0) Select language: English
Руководства how-to по Solaris 10
Я хочу превратить несколько заметок моего блога в небольшие how-to, и чтобы не повторяться, сначала решил дать вам ссылки на официальные руководства от Sun. Я уже упоминал как-то руководство по установке Solaris 10 из этой серии. Если вы их ещё не читали - обязательно прочтите, всё очень просто и понятно написано:
How to Quickly Install the Solaris 10 1/06 OS Solaris Containers: Consolidating Servers and Applications Solaris 10 Security: Eliminating Web Page Hijacking DTrace: Using DTrace from a Solaris 10 System Managing ZFS in Solaris 10 Containers Friday, 3 March. 2006
HOW-TO: использование ... Добавил Gleb Reys
в категории SysAdmin в
11:07
Комментарии (12) Обратные ссылки (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", часто это просто потому, что используется неверная версия библиотеки - более старая, или слишком новая, и нужные процедуры в ней либо отсутствуют, либо носят другие названия. Ну, я думаю всё. Если вдруг у кого-то есть дополнения к этому небольшому руководству, то милости прошу комментировать. Буду очень рад узнать ваше мнение!
« предыдущая страница
(Страница 1 из 1, всего записей: 2)
следующая страница »
|




