|
|||||||
Утилиты для получения информации о динамических библиотеках в 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 является просто исполняемым приложением, которое в нужный момент запускается ядром. |
|||||||
Так же в этом разделе:
|
|||||||
![]() |
|||||||
|
|||||||
|