Relocatable Object Module Format: відмінності між версіями
| [перевірена версія] | [перевірена версія] |
Yuriz (обговорення | внесок) джерела |
|||
| (Не показано 3 проміжні версії 2 користувачів) | |||
| Рядок 40: | Рядок 40: | ||
У OMF відсутній заголовок, що містив би, наприклад, адресу символьної таблиці чи секцій. Для отримання всієї інформації [[компонувальник]] має здійснити повний розбір файлу. Секції програми також необов'язково представлені contiguous послідовністю байтів — натомість секція може бути «розкидана» по багатьох записах. Одна з початкових версій формату, а саме 1.1, говорить, що таке розбиття ''повинно'' застосовуватися для секцій, розмір яких перевищує 1 кілобайт.{{r|omf1.1}} |
У OMF відсутній заголовок, що містив би, наприклад, адресу символьної таблиці чи секцій. Для отримання всієї інформації [[компонувальник]] має здійснити повний розбір файлу. Секції програми також необов'язково представлені contiguous послідовністю байтів — натомість секція може бути «розкидана» по багатьох записах. Одна з початкових версій формату, а саме 1.1, говорить, що таке розбиття ''повинно'' застосовуватися для секцій, розмір яких перевищує 1 кілобайт.{{r|omf1.1}} |
||
Записи, що мають {{нп|є=Relocation (computer science)|текст=інформацію про переміщення|треба=Переміщення (інформатика)|мова=en}} ({{lang-en|fixups}}) повинні завжди слідувати прямо за секціями з кодом/даними, до яких ця інформація стосується. Таким чином секції і переміщувальна інформація завжди «перемішані» всередині файла. |
Записи, що мають {{нп|є=Relocation (computer science)|текст=інформацію про переміщення|треба=Переміщення (інформатика)|мова=en}}<!-- Проблема вікіфікації: Сторінка [[:en:Relocation (computer science)]] (→ [[:en:Relocation (computing)]]) перекладена як [[Переміщуваність (інформатика)]], хоча хотіли [[Переміщення (інформатика)]] (SashkoR0B0T)--> ({{lang-en|fixups}}) повинні завжди слідувати прямо за секціями з кодом/даними, до яких ця інформація стосується. Таким чином секції і переміщувальна інформація завжди «перемішані» всередині файла. |
||
OMF має також спеціальні записи (LIDATA), що дозволяють стиснення послідовностей даних, що повторюються у об'єктному файлі. Також є можливість зберегти у .obj-файлі ім'я «точки входу» ({{lang-en|entry point}}), що буде використана лінкером при компонуванні фінальної двійкової програми.{{r|omf4.0}} |
OMF має також спеціальні записи (LIDATA), що дозволяють стиснення послідовностей даних, що повторюються у об'єктному файлі. Також є можливість зберегти у .obj-файлі ім'я «точки входу» ({{lang-en|entry point}}), що буде використана лінкером при компонуванні фінальної двійкової програми.{{r|omf4.0}} |
||
== Використання == |
== Використання == |
||
Даний об'єктний формат є основним для компіляторів і інших інструментів розробника для операційних систем MS-DOS, 16-розрядних Windows, а також для [[OS/2]] (як 16, так і 32-розрядних). |
Даний об'єктний формат є основним для компіляторів і інших інструментів розробника для [[Операційна система|операційних систем]] MS-DOS, 16-розрядних Windows, а також для [[OS/2]] (як 16, так і 32-розрядних). |
||
Деякі компілятори використовують 32-розрядний варіант OMF. Наприклад, [[Watcom C compiler]] дозволяє генерацію для 32-розрядних систем з сегментацією; компілятор Iron Spring [[PL/I]] може генерувати код для 32-розрядної OS/2 з «пласкою» моделлю пам'яті. |
Деякі компілятори використовують 32-розрядний варіант OMF. Наприклад, [[Watcom C compiler]] дозволяє генерацію для 32-розрядних систем з сегментацією; [[компілятор]] Iron Spring [[PL/I]] може генерувати код для 32-розрядної OS/2 з «пласкою» моделлю пам'яті. |
||
Середовище розробника [[Embarcadero RAD Studio]] також генерує об'єктні файли даного формату при компіляції програм для 32-розрядного варіанту Windows.<ref name=RAD>{{cite web |
Середовище розробника [[Embarcadero RAD Studio]] також генерує об'єктні файли даного формату при компіляції програм для 32-розрядного варіанту Windows.<ref name=RAD>{{cite web |
||
|url = http://docwiki.embarcadero.com/RADStudio/Rio/en/C%2B%2B_Object_File_(*.obj,_*.o) |
|url = http://docwiki.embarcadero.com/RADStudio/Rio/en/C%2B%2B_Object_File_(*.obj,_*.o) |
||
|title = C++ Object File (*.obj, *.o) |
|title = C++ Object File (*.obj, *.o) |
||
|accessdate = 14 червня 2019 |
|||
|archive-date = 30 червня 2019 |
|||
|archive-url = https://web.archive.org/web/20190630191522/http://docwiki.embarcadero.com/RADStudio/Rio/en/C++_Object_File_(*.obj,_*.o) |
|||
}}</ref> |
|||
== Див. також == |
== Див. також == |
||
| Рядок 81: | Рядок 85: | ||
|title = Linkers and Loaders |
|title = Linkers and Loaders |
||
|author = John R. Levine |
|author = John R. Levine |
||
|accessdate = 2007-01-02 |
|accessdate = 2007-01-02 |
||
|archiveurl = https://web.archive.org/web/20070216221058/http://www.iecc.com/linker/linker03.html |
|||
|archivedate = 2007-02-16 |
|||
|deadurl = yes |
|||
}} |
|||
{{Формати об'єктних і виконуваних файлів}} |
{{Формати об'єктних і виконуваних файлів}} |
||
Поточна версія на 17:26, 23 жовтня 2026
| Розширення: | ..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 відсутній заголовок, що містив би, наприклад, адресу символьної таблиці чи секцій. Для отримання всієї інформації компонувальник має здійснити повний розбір файлу. Секції програми також необов'язково представлені 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]
- Common Object File Format (COFF)
- Executable and Linkable Format (ELF)
- a.out
- ↑ Relocatable Object Module Format (OMF) Specification - Version 1.1 (PDF) (англ.). TIS. 1995 (87 pages)
{{cite web}}: Обслуговування CS1: Сторінки зі значенням параметра postscript, що збігається зі стандартним значенням в обраному режимі (посилання) - ↑ 8086 Relocatable Object Module Formats — Version 4.0. Intel. 1981 (124 pages, Intel Product Number 121748-001)
{{cite web}}: Обслуговування CS1: Сторінки зі значенням параметра postscript, що збігається зі стандартним значенням в обраному режимі (посилання) - ↑ C++ Object File (*.obj, *.o). Архів оригіналу за 30 червня 2019. Процитовано 14 червня 2019.
- John R. Levine. Linkers and Loaders. Архів оригіналу за 16 лютого 2007. Процитовано 2 січня 2007.