Администрирование систем Linux. Работа с разделяемыми библиотеками
Оригинал: Library management
Автор: Paul Cobbaut
Дата публикации: 12 марта 2015 г.
Перевод: A. Панин
Дата перевода: 2 апреля 2015 г.
Глава 29. Работа с разделяемыми библиотеками
29.1. Краткая информация о разделяемых библиотеках
При разговоре о библиотеках мы будем иметь в виду динамически связываемые библиотеки (или разделяемые объекты). Они являются бинарными файлами, содержащими код функций, которые не исполняются как приложения, а могут использоваться из других бинарных файлов.
Несколько программ могут использовать одну и ту же разделяемую библиотеку. Имя файла разделяемой библиотеки обычно начинается с префикса lib, после которого должно быть записано само имя разделяемой библиотеки, расширение .so и, наконец, номер версии разделяемой библиотеки.
29.2. Директории /lib и /usr/lib
При просмотре содержимого директорий /lib и /usr/lib можно обнаружить большое количество символьных ссылок. Имена большинства файлов разделяемых библиотек содержат подробные описания номеров версий, причем для этих файлов также создаются символьные ссылки с именами, содержащими лишь указания на номера основных версий.
root@rhel53 ~# ls -l /lib/libext*
lrwxrwxrwx 1 root root 16 фев 18 16:36 /lib/libext2fs.so.2 -> libext2fs.so.2.4
-rwxr-xr-x 1 root root 113K июн 30 2009 /lib/libext2fs.so.2.4
29.3. Утилита ldd
Работоспособность многих программ зависят от наличия определенных разделяемых библиотек в системе. Вы можете получить информацию о необходимых для корректной работы программы разделяемых библиотеках с помощью утилиты ldd.
В примере показан список разделяемых библиотек, необходимых для корректной работы утилиты su.
paul@RHEL5 ~$ ldd /bin/su
linux-gate.so.1 => (0x003f7000)
libpam.so.0 => /lib/libpam.so.0 (0x00d5c000)
libpam_misc.so.0 => /lib/libpam_misc.so.0 (0x0073c000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x00aa4000)
libdl.so.2 => /lib/libdl.so.2 (0x00800000)
libc.so.6 => /lib/libc.so.6 (0x00ec1000)
libaudit.so.0 => /lib/libaudit.so.0 (0x0049f000)
/lib/ld-linux.so.2 (0x4769c000)
29.4. Утилита ltrace
Утилита ltrace позволяет ознакомиться со списком всех вызовов функций разделяемых библиотек, осуществленных определенной программой. В приведенном ниже примере используется параметр -p, позволяющий получить информацию лишь о суммарном количестве вызовов функций (каждая функция может вызываться множество раз), а также параметр -l, позволяющий выводить информацию о вызовах функций лишь из одного файла разделяемой библиотеки. Все это делается для того, чтобы узнать, какие библиотечные функции вызываются в процессе исполнения команды su - serena с привилегиями пользователя root.
root@deb503:~# ltrace -c -l /lib/libpam.so.0 su - serena
serena@deb503:~$ exit
logout
% time seconds usecs/call calls function
------ ----------- ----------- --------- --------------------
70.31 0.014117 14117 1 pam_start
12.36 0.002482 2482 1 pam_open_session
5.17 0.001039 1039 1 pam_acct_mgmt
4.36 0.000876 876 1 pam_end
3.36 0.000675 675 1 pam_close_session
3.22 0.000646 646 1 pam_authenticate
0.48 0.000096 48 2 pam_set_item
0.27 0.000054 54 1 pam_setcred
0.25 0.000050 50 1 pam_getenvlist
0.22 0.000044 44 1 pam_get_item
------ ----------- ----------- --------- --------------------
100.00 0.020079 11 total
29.5. Команды dpkg -S и debsums
Имя пакета программного обеспечения дистрибутива Debian/Ubuntu, который содержит указанную разделяемую библиотеку, может быть установлено следующим образом.
paul@deb503:/lib$ dpkg -S libext2fs.so.2.4
e2fslibs: /lib/libext2fs.so.2.4
После этого вы можете проверить целостность всех файлов, установленных в систему из данного пакета программного обеспечения, с помощью утилиты debsums.
paul@deb503:~$ debsums e2fslibs
/usr/share/doc/e2fslibs/changelog.Debian.gz OK
/usr/share/doc/e2fslibs/copyright OK
/lib/libe2p.so.2.3 OK
/lib/libext2fs.so.2.4 OK
Если файл разделяемой библиотеки поврежден, переустановите пакет программного обеспечения с помощью команды aptitude reinstall $имя_пакета.
root@deb503:~# aptitude reinstall e2fslibs
Чтение списков пакетов Готово
Построение дерева зависимостей
Чтение информации о состоянии Готово
Чтение информации о расширенных состояниях... Готово
Инициализация состояний пакетов... Готово
Reading task descriptions... Готово
Следующие пакеты будут ПЕРЕУСТАНОВЛЕНЫ:
e2fslibs
...
29.6. Команды rpm -qf и rpm -V
Имя пакета программного обеспечения дистрибутива RedHat/Fedora, который содержит указанную разделяемую библиотеку, может быть установлено следующим образом.
paul@RHEL5 ~$ rpm -qf /lib/libext2fs.so.2.4
e2fsprogs-libs-1.39-8.el5
После этого вы можете использовать команду rpm -V для проверки целостности всех файлов, установленных из данного пакета программного обеспечения. В выводе из расположенного ниже примера содержится информация о том, что размер (Size) и метка времени модификации (Time stamp) файла разделяемой библиотеки изменились с момента его установки в систему.
root@rhel53 ~# rpm -V e2fsprogs-libs
prelink: /lib/libext2fs.so.2.4: prelinked file size differs
S.?....T /lib/libext2fs.so.2.4
В подобной ситуации вы можете использовать команду yum reinstall $имя_пакета для замены существующего в системе файла разделяемой библиотеки на его оригинальную версию.
root@rhel53 lib# yum reinstall e2fsprogs-libs
Loaded plugins: rhnplugin, security
Setting up Reinstall Process
Разрешение зависимостей
--> Проверка сценария
---> Пакет e2fsprogs-libs.i386 0:1.39-23.el5 помечен для удаления
---> Пакет e2fsprogs-libs.i386 0:1.39-23.el5 помечен для обновления
--> Проверка зависимостей окончена
...
Теперь при проверке целостности файлов из пакета программного обеспечения не выводится информации о каких-либо проблемах с файлом разделяемой библиотеки.
root@rhel53 lib# rpm -V e2fsprogs-libs
root@rhel53 lib#
29.7. Трассировка вызовов библиотечных функций с помощью утилиты strace
Более детальная трассировка вызовов всех функций из разделяемых библиотек может осуществляться с помощью утилиты strace. Начнем с создания файла, доступного только для чтения.
root@deb503:~# echo hello > 42.txt
root@deb503:~# chmod 400 42.txt
root@deb503:~# ls -l 42.txt
-r-------- 1 root root 6 2011-09-26 12:03 42.txt
После этого откроем данный файл с помощью текстового редактора vi, разместив в строке команды перед командой исполнения бинарного файла vi команду исполнения утилиты strace с записью данных трассировки в отдельный файл. Это позволит нам получить файл с информацией о всех вызовах функций разделяемых библиотек, осуществленных из бинарного файла vi.
root@deb503:~# strace -o strace.txt vi 42.txt
Созданный нами файл может быть открыт только для чтения, но мы все равно попытаемся изменить его содержимое и использовать директиву :w! для принудительной записи данных в него. После этого мы закроем текстовый редактор vi и перейдем к рассмотрению содержимого файла журнала трассировки вызовов функций разделяемых библиотек.
root@deb503:~# grep chmod strace.txt
chmod("42.txt", 0100600) = -1 ENOENT (No such file or directory)
chmod("42.txt", 0100400) = 0
root@deb503:~# ls -l 42.txt
-r-------- 1 root root 12 2011-09-26 12:04 42.txt
Обратите внимание на то, что текстовый редактор vi осуществлял изменение прав доступа к файлу дважды. Файл журнала трассировки вызовов функций разделяемых библиотек содержит большой объем информации, поэтому его содержимое не приводится в полном объеме в данной книге.
root@deb503:~# wc -l strace.txt
941 strace.txt
http://rus-linux.net/MyLDP/BOOKS/LSA/ch29.html
|