Что такое формат файла O?
Файл .o - это скомпилированный объектный файл - промежуточный бинарный файл, который создаёт компилятор, например GCC или Clang, при переводе одного исходного файла C в машинный код. Выходные данные содержат машинные инструкции, сегменты инициализированных и неинициализированных данных, таблицу символов и записи корректировки адресов, но он ещё не является исполняемым: ссылки на функции и переменные, определённые в других единицах перевода, остаются неразрешёнными плейсхолдерами для компоновщика.
Формат бинарного файла зависит от целевой платформы:
- В Linux и большинстве систем Unix/BSD файлы
.oиспользуют контейнер ELF (Executable and Linkable Format), который определяется по магическим байтам\x7FELFпо смещению 0 и значениюe_typeET_REL(переносимый, значение0x0001). - В macOS аналогичный формат использует Mach-O, начинающийся с
CF FA ED FE(64-битный little-endian). - В Windows функционально идентичный файл имеет расширение .obj и использует формат COFF.
После компиляции компоновщик (ld) объединяет один или несколько файлов .o с библиотеками для создания исполняемого файла или общей библиотеки. Несколько файлов .o также можно упаковать в статическую библиотеку с помощью команды ar.
Файлы .o - это временные артефакты сборки, автоматически создаваемые инструментарием, и они не предназначены для открытия конечными пользователями. Разработчики, которым нужно их изучить, могут использовать nm, objdump или readelf для просмотра символов, секций и дизассемблирования.
Безопасность и защита
РИСК: LOWФайл .o - это данные этапа сборки, а не то, что запускает ОС, поэтому он представляет небольшой прямой риск для конечных пользователей - вы не можете дважды кликнуть и запустить его. Для разработчиков важна доверие к цепочке поставок: компоновка объекта из ненадёжного источника «зашивает» его машинный код прямо в вашу программу, поэтому собирайте только с объектами/библиотеками из надёжных источников. Объекты в вашем собственном дереве сборки можно безопасно удалить; они будут пересозданы при следующей компиляции.
Детали формата
в двух словахПрограммы, открывающие файлы O
Технические подробности
глубокая спецификация| Формат контейнера | ELF в Linux/Unix, Mach-O в macOS, COFF в Windows (где файл обычно имеет имя `.obj`) |
| Кодирование файла | Бинарный (не текст, понятный человеку) |
| Магические байты ELF | `7F 45 4C 46` (`\x7FELF`) по смещению 0 - присутствуют во всех объектных файлах на основе ELF |
| Поле типа объекта ELF | `e_type = ET_REL` (0x0001) в заголовке ELF - отличает переносимый объект от исполняемого (`ET_EXEC`) или общей библиотеки (`ET_DYN`) |
| MIME-тип | `application/x-object`; также передаётся как `application/octet-stream` универсальными серверами |
| Порядок байтов | Кодируется в байте `EI_DATA` заголовка ELF: little-endian (`ELFDATA2LSB`) на x86/x86-64/ARM, big-endian (`ELFDATA2MSB`) на PowerPC/SPARC |
| Ключевые секции | `.text` (исполняемый код), `.data` (глобальные инициализированные переменные), `.bss` (нуль-инициализированные глобальные переменные), `.rodata` (константы только для чтения) |
| Таблица символов | Секция `.symtab` содержит имя каждого определённого и используемого символа, тип привязки (локальный/глобальный/слабый), тип (функция/объект) и значение |
| Записи корректировки адресов | Секции `.rel.text` / `.rela.text` фиксируют каждый слот адреса, который компоновщик должен исправить при объединении объектных файлов в итоговый бинарный файл |
| Идентификация архитектуры | Поле `e_machine` в заголовке ELF определяет целевую CPU: `EM_X86_64` (0x3E), `EM_AARCH64` (0xB7), `EM_386` (0x03) и др. |
| Типичный размер файла | От 1 КБ до нескольких МБ на единицу перевода, в зависимости от сложности исходного кода и уровня оптимизации компилятора |
| Сжатие | Отсутствует - объектные файлы хранятся как необработанные несжатые бинарные данные |
| Модель компиляции 1:1 | На каждый исходный файл (единицу перевода) создаётся ровно один файл `.o` (один на файл `.c` или `.cpp`); компоновщик позже объединяет их |
| Упаковка статической библиотеки | Несколько файлов `.o` архивируются в статическую библиотеку `.a` с помощью `ar`, каждый объект сохраняется как именованный член архива |
| Разрешение символов только на этапе компоновки | В отличие от общих библиотек `.so` / `.dylib`, все ссылки на символы в файле `.o` разрешаются полностью на этапе компоновки, без динамических зависимостей времени выполнения |
| Инструменты для изучения | `nm` (список символов), `objdump` (дизассемблирование и дамп секций), `readelf` (заголовок ELF и детали секций), `otool` (аналог для Mach-O в macOS) |
| Выпущен | Object-file concept from early Unix (1970s); ELF since System V Release 4 (early 1990s) |
| Последняя версия | ELF format frozen since the 1990s; container evolves with each compiler/ABI |
| Открыть стандартное | Да · без роялти |
| Спецификация | refspecs.linuxfoundation.org |
Конвертации O
Вопросы и ответы сообщества
спрошено пользователямиВопросов пока нет - станьте первым, кто спросит о файлах O.