Наши партнеры

UnixForum





Библиотека сайта 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 для проверки целостности всех файлов, установленных из данного пакета программного обеспечения. В выводе из расположенного ниже примера содержится информация о том, что размер (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

Предыдущий раздел: Оглавление Следующий раздел:
Глава 28. Ядро Linux   Глава 30. Резервные копии данных