ELF (Executable and Linkable Format) — стандартный формат исполняемых файлов, объектных файлов и разделяемых библиотек в Linux и большинстве UNIX-подобных систем. Любой ELF-файл состоит из трёх основных частей:
Один сегмент может ссылаться на несколько секций. Таблица заголовков секций часто модицируется про обфускации.

Ключевой механизм для этой работы — это секция .dynamic (динамический раздел). Она присутствует у динамически слинкованных исполняемых файлов и у .so-библиотек. Содержит массив записей вида тег -> значение. Нам будет интересен тег DT_NEEDED, поскольку каждая такая запись хранит имя разделяемой библиотеки, которая должна быть загружена во время старта программы.
objdump -p /bin/ls
NEEDED libselinux.so.1
NEEDED libc.so.6
readelf -d /bin/cat
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
ldd /bin/cat
linux-vdso.so.1 (0x0000785d14fe0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x0000785d14c00000)
/lib64/ld-linux-x86-64.so.2 (0x0000785d14fe2000)
Первые два инструмента не запускают программу, выполняют статический анализ. Инструмент
lddвыполняет программу. Следует быть осторожными.
В ELF-заголовке есть поле e_machine, которое однозначно определяет архитектуру процессора, под которую собран файл. Некоторые значения:
| Архитектура | Константа | Значение |
|---|---|---|
| x86 (i386, 32-бит) | EM_386 |
3 (0x03) |
| x86-64 (AMD64) | EM_X86_64 |
62 (0x3E) |
| ARM (32-бит) | EM_ARM |
40 (0x28) |
| AArch64 (ARM 64-бит) | EM_AARCH64 |
183 (0xB7) |
readelf -h /bin/cat
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Position-Independent Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x3ac0
Start of program headers: 64 (bytes into file)
Start of section headers: 37400 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 13
Size of section headers: 64 (bytes)
Number of section headers: 31
Section header string table index: 30
Разделяемая библиотека и исполняемый файл, который её использует, обязаны быть собраны под одну и ту же архитектуру.
Библиотека
.soи исполняемый файл имеют типET_DYNв полеe_type. Признаком исполняемого файла является наличиеPT_INTERPв Program Header Table
Утилита ldd отвечает на вопрос: "какие библиотеки нужны этому исполняемому файлу?". Наша задача построить утилиту, отвечающую на обратный вопрос: "какие исполняемые файлы в данном каталоге используют указанную библиотеку?"
NEEDED-записей из динамического раздела. Если у файла есть тип ET_EXEC/ET_DYN, но отсутствует секция .dynamic (статически слинкованный исполняемый файл), то считать, что зависимостей нет.DT_NEEDED с искомым именем библиотеки; если не совпало, то сравнение по базовому имени без версии./lib:/usr/lib:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu)Изучить внутреннее устройство формата ELF и механизм разрешения зависимостей от разделяемых библиотек в Linux. Реализовать на языке C консольную утилиту bldd, которая по заданной разделяемой библиотеке находит все зависящие от неё исполняемые файлы в указанном каталоге и формирует отсортированный отчёт об использовании.
Постройте таблицу вида
библиотека -> [исполняемые файлы], посчитайте количество исполняемых файлов на библиотеку и отсортируйте итоговый список исполняемых файлов по убыванию числа зависимостей/использований
В отчёте укажите дату генерации, каталог сканирования, искомую библиотеку, архитектуру каждого найденного файла, итоговую отсортированную таблицу
NEEDED-зависимостей (сверяется вручную через readelf -d/objdump -p)-h, выводящий описание опций и минимум 2 работающих примера команд