Перейти до вмісту

Relocatable Object Module Format

Матеріал з Вікіпедії — вільної енциклопедії.
Версія від 10:17, 14 червня 2019, створена Yuriz (обговорення | внесок) (У роботі)
(різн.) ← Попередня версія | Поточна версія (різн.) | Новіша версія → (різн.)
Relocatable Object Module Format
Розширення:..obj
Розробник:Tool Interface Standards Committee
Тип формату:Об'єктний модуль

Relocatable Object Module Format (OMF) — формат об'єктного модуля, що використовується при створенні програмного забезпечення для мікропроцесорів сімейства Intel 80x86. Формат було розроблено компанією Intel[коли?] під назвою Object Module Format; користувачам операційної системи MS-DOS він відомий як .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 відсутній заголовок, що містив би, наприклад, адресу символьної таблиці чи секцій. Для отримання всієї інформації компонувальник має здійснити повний розбір файлу.

In the OMF format the data of one section is not necessarily stored as contiguous bytes in the file, instead it can be represented by multiple records. The file format specification (version 1.1) says that this must be done for sections larger than 1 KiB. Records containing relocation information (fixups) must be stored immediately following the data records of the section they apply to, so the section data and the relocation information is "mixed" in the file.

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

Використання

Даний об'єктний формат є основним для компіляторів і інших інструментів розробника для операційних систем 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.[1]

Див. також

Джерела

  1. C++ Object File (*.obj, *.o).

Посилання