Что такое формат файла ELF?
Файлы с расширением .elf хранят двоичные данные, структурированные в соответствии со стандартом Executable and Linkable Format - форматом исполняемых и объектных файлов по умолчанию для Linux, большинства Unix-подобных систем и многих встраиваемых платформ. Формат был представлен в Unix System V Release 4 лабораторией Unix System Laboratories и позже утвержден как переносимая спецификация Tool Interface Standard (TIS).
Файлы ELF могут хранить следующие типы содержимого:
- Исполняемые файлы приложений и инструментов, часто распространяемые как файл .bin
- Скомпилированные объектные файлы, обычно имеющие расширение
.o - Разделяемые библиотеки - файлы с расширением .so
- Дампы памяти (core dumps), создаваемые после сбоя процесса
Формат построен на основе четко определенной двоичной структуры. Каждый файл .elf начинается с 4-байтовой магической последовательности 7F 45 4C 46 (0x7F, за которым следуют ASCII-символы ELF) со смещением 0, за которой следуют поля заголовка, определяющие целевую архитектуру, разрядность (32-бит или 64-бит) и порядок байтов (little-endian или big-endian). Две необязательные таблицы - таблица заголовков программы (program header table) и таблица заголовков разделов (section header table) - описывают, как сегменты должны загружаться во время выполнения и как разделы организованы для компоновки.
Хотя стандарт ELF разрабатывался с учетом систем Unix, он был быстро адаптирован другими платформами, включая игровые консоли, такие как PlayStation 2 и Wii, Android и многие встраиваемые среды. Стандартный MIME-тип - application/x-elf. Содержимое файла .elf не предназначено для чтения человеком; такие инструменты, как readelf и objdump (оба входят в состав GNU Binutils), позволяют проверять заголовки и дизассемблировать код без его выполнения.
Безопасность и защита
РИСК: HIGHКак и любой исполняемый файл, ELF может содержать вредоносное ПО - ботнеты для Linux/IoT (например, варианты Mirai) поставляются в виде бинарных файлов ELF, и ELF запускается с вашими привилегиями. Запускайте файлы ELF только из доверенных источников; не используйте «chmod +x» для запуска случайных загрузок. Безопасно проверяйте неизвестные ELF с помощью readelf/objdump или сканируйте их на VirusTotal перед запуском. Консольные homebrew-файлы .elf менее рискованны (они работают внутри «песочницы» эмулятора), но все же берите их из проверенных источников.
Детали формата
в двух словахПрограммы, открывающие файлы ELF
Технические подробности
глубокая спецификация| Магическое число | `7F 45 4C 46` (0x7F, за которым следует ASCII `ELF`) по смещению 0; присутствует в каждом валидном файле ELF |
| MIME-тип | `application/x-elf` |
| Варианты разрядности | 32-бит (EI_CLASS = `01`) и 64-бит (EI_CLASS = `02`), закодированные по смещению 4 в заголовке ELF |
| Поле порядка байтов | EI_DATA по смещению 5: `01` = little-endian, `02` = big-endian; определяется архитектурой целевого оборудования |
| Типы файлов (e_type) | ET_EXEC (исполняемый), ET_REL (перемещаемый объект), ET_DYN (разделяемый объект или PIE), ET_CORE (дамп памяти) |
| Целевые архитектуры | x86, x86-64, ARM, AArch64, MIPS, RISC-V, PowerPC, SPARC и многие другие, идентифицируемые по полю `e_machine` в заголовке ELF |
| Идентификатор OS/ABI | Байт EI_OSABI по смещению 7 указывает целевой ABI: 0 = System V, 3 = Linux, 9 = FreeBSD, 12 = Solaris |
| Структура макета | Заголовок ELF → необязательная таблица заголовков программы (сегменты загрузки среды выполнения) → данные → необязательная таблица заголовков разделов (разделы времени компоновки) |
| Основные именованные разделы | `.text` (код), `.data` (инициализированные данные), `.bss` (неинициализированные данные), `.rodata` (константы), `.symtab` / `.dynsym` (символы), `.rel` / `.rela` (перемещения) |
| Динамическая компоновка | Разделяемые объекты разрешаются во время загрузки динамическим компоновщиком (`ld.so`); путь к необходимому интерпретатору хранится в заголовке программы `PT_INTERP` |
| Отладочная информация | Отладочные данные DWARF встраиваются в разделы ELF `.debug_*` и могут быть удалены из рабочих бинарных файлов командой `strip` |
| Позиционно-независимые исполняемые файлы | Бинарные файлы PIE имеют тип ET_DYN и поддерживают ASLR; ядро Linux рандомизирует их базовый адрес загрузки при каждом запуске |
| Основные инструменты проверки | `readelf -a` (заголовки, символы, разделы) и `objdump -d` (дизассемблирование), оба предоставляются GNU Binutils |
| Выпущен | 1989 (Unix System V Release 4); adopted as the TIS/System V ABI standard |
| Открыть стандартное | Да · без роялти |
| Спецификация | refspecs.linuxfoundation.org |
Конвертации ELF
Вопросы и ответы сообщества
спрошено пользователямиВопросов пока нет - станьте первым, кто спросит о файлах ELF.