Библиотека сайта rus-linux.net
Администрирование систем 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
для проверки целостности всех файлов, установленных из данного пакета программного обеспечения. В выводе из расположенного ниже примера содержится информация о том, что размер (S
ize) и метка времени модификации (T
ime 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
Предыдущий раздел: | Оглавление | Следующий раздел: |
Глава 28. Ядро Linux | Глава 30. Резервные копии данных |