Вопрос или проблема
Для исполняемого файла 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-формата. Чтобы получить импортированные символы, выполните следующие команды:
-
Получение информации о динамической секции:
readelf -d <имя_файла>
Этот вызов выведет динамическую секцию файла, где вы сможете заметить строки с меткой
NEEDED
, указывающие на необходимые библиотеки. Например:Dynamic section at offset 0x630a8 contains 23 entries: Tag Type Name/Value 0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6]
-
Получение информации о символах:
Также вы можете использовать:readelf -s <имя_файла>
Это покажет таблицу символов, которая включает экспортированные и импортированные символы. Однако для фильтрации конкретно импортированных символов вам, возможно, понадобится дополнительная обработка вывода.
Использование objdump
objdump
является другим мощным инструментом, который можно использовать для работы с ELF-файлами. С помощью него вы можете запрашивать различные детали объекта.
-
Получение динамической секции из вывода
objdump
:objdump -p <имя_файла> | grep NEEDED
Эта команда выведет строки, соответствующие импортируемым библиотекам, с пометкой
NEEDED
. Использованиеgrep
здесь удобно, так как оно позволяет быстро фильтровать выходные данные. -
Посмотреть все доступные символы:
Хотяobjdump
может предоставить множество деталей, вы можете использовать:objdump -T <имя_файла>
Однако, как вы уже упомянули, его вывод может быть излишне подробным и трудным для анализа по сравнению с
readelf
.
Заключение
Каждый из этих инструментов — readelf
и objdump
— предоставляет разные подходы к анализу ELF-исполняемых файлов. Преимущество readelf
в его простоте и чистоте вывода, тогда как objdump
предоставляет более детализированные данные, которые могут потребовать дополнительной обработки. Выбор инструмента зависит от ваших предпочтений и конкретных задач.