Как перечислить импортированные символы в ELF-исполняемом файле?

Вопрос или проблема

Для исполняемого файла PE я могу перечислить импортированные символы, используя

dumpbin /imports FILE.EXE

или используя утилиту depends, которая является графическим приложением.

nm ELF-файла просто возвращает “нет символов”.

Попробуйте это:

objdump -T 'ELF-файл'

Вывод от objdump немного избыточен для этой цели и требует значительного количества парсинга, чтобы найти фактические импорты.

Для этой цели я предпочитаю readelf:

readelf -d dynamic-buffer-test

Динамический раздел по смещению 0x630a8 содержит 23 записи:
 Тег                Тип                 Имя/Значение
 0x0000000000000001 (NEEDED)             Общая библиотека: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Общая библиотека: [libm.so.6]
 0x0000000000000001 (NEEDED)             Общая библиотека: [libc.so.6]
 0x0000000000000001 (NEEDED)             Общая библиотека: [libgcc_s.so.1]

Как вы можете видеть, необходимые библиотеки отмечены “NEEDED”.

Я предпочитаю readelf.

readelf -s <файл>

В дополнение к другим ответам, опубликованным здесь, я хотел бы предложить еще один. Содержимое, напечатанное здесь, является функцией формата файла, где ELF хорошо подходит для решения этой проблемы.

objdump -p /path/to/binary | grep NEEDED

Команда grep просто извлекает содержимое Динамического раздела, но именно формат вывода objdump -p делает это простым решением.

Ответ или решение

Для того чтобы перечислить импортированные символы в ELF-исполняемом файле, существует несколько полезных инструментов, которые помогут вам достичь этой цели. В отличие от PE-исполняемых файлов, где можно использовать команду dumpbin /imports, для ELF-файлов подойдут следующие методы:

Использование readelf

Одним из самых простых и эффективных инструментов для работы с ELF-файлами является readelf. Этот инструмент позволяет извлекать различные секции и атрибуты ELF-формата. Чтобы получить импортированные символы, выполните следующие команды:

  1. Получение информации о динамической секции:

    readelf -d <имя_файла>

    Этот вызов выведет динамическую секцию файла, где вы сможете заметить строки с меткой NEEDED, указывающие на необходимые библиотеки. Например:

    Dynamic section at offset 0x630a8 contains 23 entries:
    Tag                Type                 Name/Value
    0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
  2. Получение информации о символах:
    Также вы можете использовать:

    readelf -s <имя_файла>

    Это покажет таблицу символов, которая включает экспортированные и импортированные символы. Однако для фильтрации конкретно импортированных символов вам, возможно, понадобится дополнительная обработка вывода.

Использование objdump

objdump является другим мощным инструментом, который можно использовать для работы с ELF-файлами. С помощью него вы можете запрашивать различные детали объекта.

  1. Получение динамической секции из вывода objdump:

    objdump -p <имя_файла> | grep NEEDED

    Эта команда выведет строки, соответствующие импортируемым библиотекам, с пометкой NEEDED. Использование grep здесь удобно, так как оно позволяет быстро фильтровать выходные данные.

  2. Посмотреть все доступные символы:
    Хотя objdump может предоставить множество деталей, вы можете использовать:

    objdump -T <имя_файла>

    Однако, как вы уже упомянули, его вывод может быть излишне подробным и трудным для анализа по сравнению с readelf.

Заключение

Каждый из этих инструментов — readelf и objdump — предоставляет разные подходы к анализу ELF-исполняемых файлов. Преимущество readelf в его простоте и чистоте вывода, тогда как objdump предоставляет более детализированные данные, которые могут потребовать дополнительной обработки. Выбор инструмента зависит от ваших предпочтений и конкретных задач.

Оцените материал
Добавить комментарий

Капча загружается...