Relocatable Object Module Format

формат файлу

Relocatable Object Module Format (OMF) — формат об'єктного модуля, що використовується при створенні програмного забезпечення для мікропроцесорів сімейства Intel 80x86. Формат було розроблено компанією Intel[коли?] під назвою Object Module Format; користувачам операційної системи MS-DOS він відомий як .OBJ-файл. Формат було стандартизовано організацією Tool Interface Standards Committee.

Relocatable Object Module Format
Розширення файлу: ..obj
Розробник: Tool Interface Standards Committee
Тип формату: Об'єктний модуль

Опис формату ред.

Багато об'єктних форматів складаються з набору таблиць (таких, наприклад, як таблиці релокації), що зберігаються або у фіксованій позиції всередині файлу — прикладом може бути a.out, або за адресами, вказаними у заголовку — як у форматі ELF. Секції, або сегменти, такі як «код», «дані» і інші, зберігаються у файлі у вигляді contiguous послідовності байтів.

Однак, коли створювався Relocatable Object Module Format, однією з головних цілей була мінімізація об'єму пам'яті, потрібного для компонування програми. Через цю вимогу OMF було спроектовано як послідовність записів, формат деяких них наступний:

Розмір Вміст
1 байт Тип запису (див. нижче)
2 байти Довжина даних (N+1)
N байт Дані (довжина залежить від типу запису)
1 байт Контрольна сума або 0

Через те, що формат використовувався багатьма вендорами, типів записів існує досить багато. Нововведення на зразок 32-розрядного коду або динамічних бібліотек (які, природно, не були передбачені Intel під час створення формату) також додають різноманітності. Нижче наведено деякі важливі типи записів:

  • COMENT — (88h) Коментар, що також може містити деяку інформацію для керування
  • EXTDEF — (8Ch) Визначення зовнішніх посилань
  • PUBDEF — (90h/91h) Визначення публічних імен у цьому модулі
  • SEGDEF — (98h/99h) Визначення сегментів
  • GRPDEF — (9Ah) Визначення груп сегментів, наприклад DGROUP для MS-DOS
  • FIXUPP — (9Ch/9Dh) Записи, що описують «fixup» (переміщувальна інформація)
  • LEDATA — (A0h/A1h) Тіло секції коду або даних
  • COMDEF — (B0h) Неініціалізовані спільні дані
  • COMDAT — (C2h/C3h) Ініціалізовані спільні дані
  • MODEND — (8Ah/8Bh) Вказує на кінець модуля

У OMF відсутній заголовок, що містив би, наприклад, адресу символьної таблиці чи секцій. Для отримання всієї інформації компонувальник має здійснити повний розбір файлу. Секції програми також необов'язково представлені contiguous послідовністю байтів — натомість секція може бути «розкидана» по багатьох записах. Одна з початкових версій формату, а саме 1.1, говорить, що таке розбиття повинно застосовуватися для секцій, розмір яких перевищує 1 кілобайт.[1]

Записи, що мають інформацію про переміщення[en] (англ. fixups) повинні завжди слідувати прямо за секціями з кодом/даними, до яких ця інформація стосується. Таким чином секції і переміщувальна інформація завжди «перемішані» всередині файла.

OMF має також спеціальні записи (LIDATA), що дозволяють стиснення послідовностей даних, що повторюються у об'єктному файлі. Також є можливість зберегти у .obj-файлі ім'я «точки входу» (англ. entry point), що буде використана лінкером при компонуванні фінальної двійкової програми.[2]

Використання ред.

Даний об'єктний формат є основним для компіляторів і інших інструментів розробника для операційних систем MS-DOS, 16-розрядних Windows, а також для OS/2 (як 16, так і 32-розрядних).

Деякі компілятори використовують 32-розрядний варіант OMF. Наприклад, Watcom C compiler дозволяє генерацію для 32-розрядних систем з сегментацією; компілятор Iron Spring PL/I може генерувати код для 32-розрядної OS/2 з «пласкою» моделлю пам'яті.

Середовище розробника Embarcadero RAD Studio також генерує об'єктні файли даного формату при компіляції програм для 32-розрядного варіанту Windows.[3]

Див. також ред.

Джерела ред.

  1. Relocatable Object Module Format (OMF) Specification - Version 1.1 (PDF) (англ.). TIS. 1995 (87 pages)
  2. 8086 Relocatable Object Module Formats — Version 4.0. Intel. 1981 (124 pages, Intel Product Number 121748-001)
  3. C++ Object File (*.obj, *.o). Архів оригіналу за 30 червня 2019. Процитовано 14 червня 2019.

Посилання ред.