MyTetra Share
Делитесь знаниями!
Утилиты для получения информации о динамических библиотеках в Linux
Время создания: 23.07.2024 09:53
Автор: М. Тим Джонс
Текстовые метки: linux, динамическая, библиотека, исследование, информация, получение, заголовок
Раздел: Компьютер - Программирование - Язык C (Си)
Запись: xintrea/mytetra_syncro/master/base/17217176230xweny1miq/text.html на raw.github.com

В Linux доступны разнообразные утилиты для вывода содержимого и анализа ELF-файлов (в том числе совместно используемых библиотек). Одна из самых полезных утилит – ldd, которая выдает список библиотек, от которых зависит данный ELF-объект. Например, для последнего примера вывод команды ldd будет выглядеть примерно так:



mtj@camus:~/dl$ ldd fileWithDl

linux-gate.so.1 => (0xffffe000)

libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7fdb000)

libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7eac000)

/lib/ld-linux.so.2 (0xb7fe7000)

mtj@camus:~/dl$



Утилита ldd сообщила нам, что ELF-файл fileWithDl зависит от библиотек linux-gate.so (специальный псевдофайл, который отвечает за обработку системных вызовов Linux и не находится на файловой системе), libdl.so (API динамической загрузки), libc.so (библиотека GNU C) и ld-linux.so.2 (динамический загрузчик Linux – он присутствует всегда, когда есть зависимости от совместно используемых библиотек).


Понять и вывести содержимое ELF-файла поможет мощная команда readelf. Одна из интересных возможностей этой команды – вывод списка перемещаемых элементов файла. Например, покажем, какие символы в нашей тестовой программе из листинга 2 требуют перемещения:



mtj@camus:~/dl$ readelf -r fileWithDl


Relocation section '.rel.dyn' at offset 0x520 contains 2 entries:

(Раздел перемещения '.rel.dyn' со смещением 0x520 содержит 2 пункта:)

Offset Info Type Sym.Value Sym. Name

(Смещение) (Инфо) (Тип) (Знач.симв.)(Имя симв.)

08049a3c 00001806 R_386_GLOB_DAT 00000000 __gmon_start__

08049a78 00001405 R_386_COPY 08049a78 stdin


Relocation section '.rel.plt' at offset 0x530 contains 8 entries:

Offset Info Type Sym.Value Sym. Name

08049a4c 00000207 R_386_JUMP_SLOT 00000000 dlsym

08049a50 00000607 R_386_JUMP_SLOT 00000000 fgets

08049a54 00000b07 R_386_JUMP_SLOT 00000000 dlerror

08049a58 00000c07 R_386_JUMP_SLOT 00000000 __libc_start_main

08049a5c 00000e07 R_386_JUMP_SLOT 00000000 printf

08049a60 00001007 R_386_JUMP_SLOT 00000000 dlclose

08049a64 00001107 R_386_JUMP_SLOT 00000000 sscanf

08049a68 00001907 R_386_JUMP_SLOT 00000000 dlopen

mtj@camus:~/dl$



Из этого списка видно, что перемещения требуют различные вызовы библиотек C (libc.so), в том числе вызовы к libdl.so. Обратите внимание на __libc_start_main: это функция библиотеки C, которая вызывается перед main и производит всю необходимую инициализацию.

Среди других утилит упомянем objdump, которая печатает сведения об объектных файлах, и nm, служащую для вывода списка символов объектного файла (включая отладочную информацию). Кстати, можно запускать динамический компоновщик Linux прямо из командной строки, указав в параметре ELF-программу, которую требуется выполнить:



mtj@camus:~/dl$ /lib/ld-linux.so.2 ./fileWithDl

> libm.so expf 0.0

1.000000

>



В добавок, ld-linux.so может выдать список зависимостей для ELF-файла – точно так же, как делает команда ldd. Для этого существует опция --list. Не забывайте, что ld-linux.so является просто исполняемым приложением, которое в нужный момент запускается ядром.


Так же в этом разделе:
 
MyTetra Share v.0.64
Яндекс индекс цитирования