GOFF - GOFF - Wikipedia
The GOFF Specifikace (Generalized Object File Format) byla vyvinuta pro IBM MVS operační systém nahradit IBM Formát souboru objektu OS / 360 kompenzovat slabiny ve starším formátu.[1]
Pozadí
Původní IBM Formát souboru objektu OS / 360 byl vyvinut v roce 1964 pro nový IBM System / 360 sálový počítač. Tento formát používali také tvůrci sálových počítačů kompatibilních se zásuvkami a podobných sálových počítačů, včetně Univac 90/60, 90/70 a 90/80 a Fujitsu B2800. Formát byl rozšířen o symbolické záznamy a rozšířené informace o modulech, plus podporu postupů a funkcí s názvy delšími než 8 znaků. I když to pomohlo, neposkytlo to vylepšené informace nezbytné pro dnešní složitější programovací jazyky a pokročilejší funkce, jako jsou objekty, vlastnosti a metody, Unicode podpora a virtuální metody.
Formát souboru objektů GOFF byl vyvinut společností IBM přibližně v roce 1995 jako prostředek k překonání těchto problémů.[2] Nejstarší zmínka o tomto formátu byla v úvodních informacích o novém High Level Assembler.[3] Všimněte si, že formát souboru objektu OS / 360 byl jednoduše nahrazen formátem GOFF, nebyl zastaralý a je stále používán assemblery a překladači jazyků, kde jazyk vydrží omezení staršího formátu.
Konvence
Tento článek bude používat termín „modul“ k označení jakéhokoli názvu nebo ekvivalentního symbolu, který se používá k poskytnutí identifikátoru pro část kódu nebo data mimo rozsah na které se odkazuje. Modul může odkazovat na podprogram, funkci, Fortran Společná nebo bloková data, objekt nebo třída, metoda nebo vlastnost objektu nebo třídy nebo jakákoli jiná pojmenovaná rutina nebo identifikátor externí k danému oboru odkazující na externí název.
Výrazy „assembler“ pro program, který převádí montážní jazyk na strojový kód, stejně jako "shromáždit" jako proces používání jednoho a sestavit," protože proces použití „kompilátoru“, který dělá totéž pro jazyky vyšší úrovně, by měl pro účely tohoto článku platit. být považovány za zaměnitelné; takže tam, kde se používají „kompilace“ a „kompilátor“, nahraďte „sestavení“ a „assembler“ podle potřeby.
Čísla použitá v tomto článku jsou vyjádřena takto: pokud není uvedeno jako hexadecimální (základ 16), všechna použitá čísla jsou v desítkové soustavě (základ 10). Pokud je nutné vyjádřit šestnáctkové číslo, standardní formát assembleru sálového počítače s použitím velkého písmene X před číslem, vyjádření všech šestnáctkových písmen v čísle velkým písmem a uzavření čísla do jednoduchých uvozovek, např. číslo 15 mrtvý hovězí16 by byl vyjádřen jako X'15DEADBEEF '.
„Bajt“, jak je používán v tomto článku, je 8 bitů, a pokud není uvedeno jinak, „bajt“ a „znak“ jsou totéž; znaků v EBCDIC jsou také 8bitové. Když jsou vícebajtové znakové sady (například Unicode ) se používají v uživatelských programech, budou používat dva (nebo více) bajtů.
Požadavky a omezení
Formát je podobný formátu OS / 360 Object File Format, ale přidává další informace pro použití při vytváření aplikací.[4]
- Soubory GOFF jsou záznamy s pevnou nebo proměnnou délkou.
- Záznam GOFF musí zcela zapadat do jednoho záznamu podkladového systému souborů. Soubor GOFF není proud -typový soubor.
- Záznamy s pevnou délkou musí mít 80 bajtů. Minimální velikost záznamu s proměnnou délkou je 56 bajtů. V případě záznamů s pevnou délkou budou na konci záznamu nevyužité bajty. Tyto bajty musí být nastaveny na binární nulu.
- Program, který čte (nebo zapisuje) záznamy GOFF, nemá vytvářet předpoklady o vnitřním formátu záznamů, předpokládá se, že operační systém je schopen poskytovat záznamy s pevnou nebo proměnnou délkou, aniž by je program musel číst, aniž by musel vědět o provozu správa interních souborů systému. Délka záznamu není součástí samotného záznamu.
- Binární hodnoty jsou uloženy v velký endian formát, např. hodnota 1 je X'01 'pro 8bitovou hodnotu, X'0001' pro 16bitovou hodnotu, X'00000001 'pro 32bitovou hodnotu a X'0000000000000001' pro 64bitovou hodnotu.
- Bity se počítají zleva doprava; bit 0 je bit nejvíce vlevo v bajtu nebo slově.
- U souborů GOFF nasazených na jsou vyžadovány záznamy pevné délky Unix systémy.
- Záznam může pokračovat v dalším záznamu. Pokud se v záznamu pokračuje, mezi pokračujícím záznamem a záznamem o pokračování se nesmí vyskytnout žádné intervenující záznamy.
- Soubor objektu GOFF začíná záznamem HDR a končí záznamem KONEC. Záznam END by měl v souboru obsahovat počet záznamů GOFF (nikoli počet fyzických záznamů).
- Překladač jazyků nebo assembler může produkovat více souborů GOFF v jedné kompilaci / sestavení, ale jednotlivé soubory GOFF musí být navzájem oddělené.
- Názvy modulů a tříd rozlišují velká a malá písmena. Modul s názvem "exit" (jak jej používá C jazyk) nemusí být stejný jako "EXIT" používaný v Fortran Jazyk.
- Některé konvence použitelné pro formát souborů objektů OS / 360 se přenášejí do formátu souborů objektů GOFF, včetně:
- Pokud není uvedeno jinak, všechny znaky jsou v EBCDIC znaková sada, s výjimkou externích jmen, jak je uvedeno níže.
- ESD položky (hlavní programy, podprogramy, funkce, FORTRAN Common, metody a vlastnosti v objektech) musí být očíslovány počínaje 1 a každá nová položka má mít další číslo v pořadí, bez jakýchkoli „mezer“ v pořadí číslování.
- Položka ESD musí být definována dříve, než na ni bude odkazovat jakýkoli jiný záznam (například záznam TXT nebo RLD).
- Každý záznam ESD obsahuje přesně jednu položku ESD. (To se liší od starého formátu, který umožňoval až 3 položky ESD v každém záznamu ESD.)
- Záznam RLD (slovník přemístění[5]) může obsahovat jednu nebo více položek a záznam RLD může pokračovat k dalšímu záznamu.
- Aby byla zajištěna budoucí kompatibilita, pole označená jako „rezervovaná“ by měla být nastavena na binární nulu.
- Znakové sady používané pro externí názvy nejsou definovány standardem GOFF, ale existuje ustanovení, aby soubor označoval, jaká znaková sada se používá. (Jedná se o podporu dvoubajtové znakové sady Unicode - názvy modulů na bázi.) Některé produkty IBM však povolují znaky pro externí názvy a další identifikátory pouze v omezeném rozsahu, obvykle (EBCDIC) hexadecimální hodnoty X'41 'až X'FE' plus posun a vstup znaků, X'0F 'a X'0E'.
- Nový formát podporuje názvy tříd, z nichž jsou dva typy, Rezervováno a dodáno uživatelem nebo nevyhrazeno. Všechny názvy tříd mají maximální délku 16 znaků.
- Názvy vyhrazené třídy se skládají z jednoho písmene, podtržítka a 1 až 14 znaků. Názvy vyhrazených tříd začínající na B_ jsou vyhrazeny pro pojivo; Názvy vyhrazených tříd začínající na C_ označeno jako načíst jsou vyhrazeny pro programy vytvořené pro použití s jazykovým prostředím IBM (LE). Názvy tříd začínající na C_ které nejsou označeny jako načtitelné, stejně jako třídy začínající na X_, Y_ nebo Z_ jsou k dispozici pro obecné použití jako nevyhrazeno.
- Názvy tříd dodaných uživatelem mohou být malá.
- Názvy tříd jsou ne vnější symboly.
- V případě potřeby pro účely kompilace lze odkazovat na následující třídy používané pořadačem:
B_ESD | Třída slovníku externích symbolů |
B_TEXT | Textová třída |
B_RLD | Třída slovníku přemístění |
B_SYM | Třída tabulky interních symbolů |
B_IDRL | Třída údajů o identifikaci překladače jazyků |
B_PRV | Třída pseudoregistrace |
B_IDRU | Uživatelem zadaná třída identifikačních dat |
- Následující názvy tříd jsou rezervovány pořadačem a nejsou přístupné pro uživatelské aplikace:
B_IDRB | Informace o pojivových datech |
B_IDRZ | Informace o datech SUPER-Zap |
B_IMPEXP | Tabulka import-export |
B_LIT | Načítání informační tabulky |
B_MAP | Mapování dat |
- Informace o symbolické tabulce souboru objektů SYM ze záznamu formátu souboru objektu 360 nejsou k dispozici pro soubory objektů GOFF; místo toho musí být použit záznam ADATA (dílčí záznam do TXT).
Typy záznamů
Podobně jako ve starším formátu OS / 360 jsou záznamy souborů objektů rozděleny do 6 různých typů záznamů, některé přidány, některé odstraněny, jiné změněny:
- Záznam HDR (toto je nový) musí nastat nejdříve, definuje záhlaví souboru objektu.
- Záznamy ESD definují hlavní programy, podprogramy, funkce, fiktivní sekce, Fortran Common, metody a vlastnosti a jakýkoli modul nebo rutinu, kterou lze vyvolat jiným modulem. Používají se k definování programů nebo segmentů programu, které byly kompilovány při tomto spuštění kompilátoru, a externích rutin používaných programem (například exit () v C, VOLEJTE KONEC v Fortran; new () a dispose () v Pascal ). Záznamy o ESD by se měly objevit před jakýmkoli odkazem na symbol ESD.
- Byly rozšířeny záznamy TXT a kromě toho, že obsahují strojní pokyny nebo data, která jsou v modulu držena, obsahují také záznamy IDR (Identification Data) (20 nebo více typů), záznamy Associated Data (ADATA) a další související informace do modulu.
- Záznamy RLD se používají k přemístění adres. Například program odkazující na adresu umístěnou 500 bajtů uvnitř modulu interně uloží adresu jako 500, ale když je modul načten do paměti, musí být umístěn někde jinde, takže záznam RLD informuje editor propojení nebo zavaděč adresy ke změně. Také když modul odkazuje na externí symbol, obvykle nastaví hodnotu symbolu na nulu, pak pro tento symbol zahrne položku RLD, aby umožnil editoru zavaděče nebo propojení změnit adresu na správnou hodnotu.
- Záznamy LEN jsou nové a poskytují určité informace o délce.
- Záznamy END označují konec modulu a volitelně také místo, kde má program zahájit provádění. Toto musí být poslední záznam v souboru.
Formát
Záznamy GOFF mohou mít pevnou nebo proměnnou délku; minimální délka při použití záznamů s proměnnou délkou je 56 znaků, ačkoli většina záznamů bude delší než tato. Kromě jmen modulů a tříd jsou všechny znaky v EBCDIC znaková sada. Systémy založené na unixu musí používat záznamy s pevnou délkou (80 bajtů). Záznamy v souborech s pevnou délkou, které jsou kratší než pevná délka, by měly být vyplněny nulou. Chcete-li rozlišit záznamy GOFF od staršího formátu OS / 360 nebo od příkazů, které mohou být v souboru, první bajt každého záznamu GOFF je vždy binární hodnota X'03 ', zatímco příkazy musí začínat znakovou hodnotou alespoň mezera (X'40 '). Další 2 bajty záznamu GOFF označují typ záznamu, pokračování a verzi formátu souboru. Tyto první 3 bajty jsou známé jako PTV pole.
PTV
Pole PTV představuje první 3 bajty každého záznamu GOFF.
Byte | Bity | Hodnota | Účel |
---|---|---|---|
0 | Všechno | 03 | Označuje začátek záznamu GOFF |
1 | 0-3 | 0 | Záznam ESD (externí symbol) |
1 | Záznam TXT (text) | ||
2 | Záznam RLD (přemístění) | ||
3 | Záznam LEN (délka) | ||
4 | KONEC (konec) záznamu | ||
X'5'-X'E ' | Rezervováno | ||
X'F ' | Záznam HDR (záhlaví) | ||
4-5 | Rezervováno | ||
6-7 | 00 | Počáteční záznam, který nepokračuje v dalším záznamu. To by měla být jediná hodnota použitá pro záznamy GOFF s proměnnou délkou | |
01 | Počáteční záznam, který pokračuje dalším záznamem | ||
10 | Pokračující záznam nepokračuje u dalšího záznamu | ||
11 | Pokračovací záznam, který pokračuje dalším záznamem | ||
2 | Všechno | 00 | Verze Číslo formátu souboru objektu. Všechny hodnoty kromě X'00 'jsou vyhrazeny |
HDR
Záznam HDR je vyžadován a musí být prvním záznamem.
Bajty | Velikost | Pole | Hodnota | Účel |
---|---|---|---|---|
0-2 | 3 | PTV | X'03F000 ' | Pouze povolená hodnota; Záznam HDR aktuálně nelze pokračovat |
3-47 | 45 | 0 | Rezervováno | |
48-51 | 4 | Úroveň architektury | Binární 0 nebo 1 | Úroveň architektury GOFF; všechny hodnoty kromě 0 a 1 jsou rezervovány |
52-53 | 2 | Vlastnosti modulu Velikost | binární | Délka pole Vlastnosti modulu |
54-59 | 6 | 0 | Rezervováno | |
60- | 0+ | Vlastnosti modulu | Seznam vlastností modulu (volitelný) |
ESD
Záznam ESD uvádí veřejné jméno modulu, hlavního programu, podprogramu, procedury, funkce, vlastnosti nebo metody v objektu, Fortran Common nebo alternativní vstupní bod. Před jakýmkoli jiným odkazem na tento název musí být v souboru přítomen záznam ESD pro veřejné jméno.
Bajty | Velikost | Pole | Hodnota (nebo bity) | Účel | |
---|---|---|---|---|---|
0-2 | 3 | PTV | X'030000 ' | Záznam ESD bez pokračování | |
X'030100 ' | ESD záznam, který pokračuje dalším záznamem | ||||
3 | 1 | Typ symbolu | 00 | SD - definice sekce; Používá se pro dřívější hodnoty SD, CM (Common) a PC (Private Code, SD, jehož název je prázdný). Hodnota ESDID „Parent“ musí být 0. Slouží k definování hlavního programu, podprogramu nebo funkce, pro kterou je kód součástí tohoto souboru. Používá se také pro Fortran Common. | |
01 | ED - externí definice. „Rodičovský“ ESDID musí být nenulový a musí být hodnotou záznamu SD, který odkazuje na tento externí symbol. Pokud hodnota RLD odkazuje na třídu, do které tato položka patří, musí být v poli Externí název uvedena Třída, na kterou tento prvek odkazuje. Slouží k pojmenování volané procedury nebo funkce. | ||||
02 | LD - definice štítku. „Nadřazený“ ESDID musí být nenulový a musí být hodnotou záznamu SD, který v sobě definuje tento symbol. To lze použít k vytvoření aliasu pro modul nebo k vystavení jeho části jako samostatné rutiny. Například knihovna run-time pro konkrétní programovací jazyk může mít určité funkce, které musí sama používat, ale které jsou užitečné pro programy napsané pomocí tohoto jazyka, a proto může být funkci přidělen štítek, aby ji bylo možné přímo volat. Například může existovat kompletní balíček matematiky jako jeden modul a všechny standardní funkce (Sine, Cosine, Square Root atd.) Lze v tomto modulu pojmenovat jako vstupní body. | ||||
03 | PR - Referenční část nebo Pseudo registr. Rozlišeno podle pole ID prostoru jmen. „Nadřazený“ ESDID musí být nenulový a musí být hodnotou záznamu SD, který v sobě definuje tento symbol. | ||||
04 | ER a WX - externí reference / slabá externí reference. Rozlišuje se podle hodnoty „Vazebná síla“ v poli „Atributy“. WX se používá tam, kde může chybět cizí rutina. Například pokud měl program kalkulačky rychlý vysoce výkonný matematický balíček, který byl volitelný, mohl by být nazýván jako WX, a pokud chyběl nebo nebyl k dispozici, mohl program přejít na menší matematický balíček. | ||||
4-7 | 4 | ESDID | Binární | Identifikátor ESDID počínaje 1. Každý nový ESDID musí být přesně o 1 vyšší než předchozí položka. | |
8-11 | 4 | Mateřský ESDID | binární | Toto je ESDID objektu, který definuje tuto položku, pokud je součástí jiného objektu. Je 0, pokud nemá žádného rodiče. | |
12-15 | 4 | 0 | Rezervováno | ||
16-19 | 4 | Ofset | Binární | Adresa tohoto symbolu v rámci jeho nadřazeného ESDID pro položky LD nebo ED; jinak nula. | |
20-23 | 4 | 0 | Rezervováno | ||
24-27 | 4 | Délka | Binární | Délka této položky pro typy ED a PR; jinak nula. Pokud je aktuální hodnota délky odložena; tato hodnota je nastavena na -1. | |
28-31 | 4 | ESDID s rozšířeným atributem | Binární | ESDID prvku, který obsahuje rozšířené informace o atributech pro typy ED a LD; obvykle se používá tam, kde jsou DLL podporovány pro symboly, které jsou vyřešeny za běhu (jako virtuální metody). Jinak nula. | |
32-35 | 4 | Ofset s rozšířeným atributem | Binární | Adresa, kde lze najít rozšířené atributy pro předchozí pole, použitá pro záznamy ED a LD s rozšířenými atributy; jinak nula. | |
36-39 | 4 | 0 | Rezervováno | ||
40 | 1 | Název prostoru ID | Určuje jmenný prostor, do kterého patří | ||
0 | Vyhrazeno pro pořadač správy programů | ||||
1 | Normální název | ||||
2 | Pseudo registr | ||||
3 | Díly (Externí položky přidělené místo včetně položek obsahujících inicializovaná statická data) | ||||
41 | 1 | Vlajky | |||
Vyplňte přítomný | Bit 0 | 0 | No Fill | ||
1 | Vyplnit bajt přítomen (platí pouze pro typy ED) | ||||
Mangled | Bit 1 | 0 | Symbol není rozbitý | ||
1 | Symbol může být rozbitý | ||||
Přejmenovatelný | Bit 2 | 0 | Nelze přejmenovat (stejně jako příznak 'mapovaný' v XOBJ) | ||
1 | Symbol lze přejmenovat (může se účastnit přejmenování typu Language Environment (LE)) | ||||
Vyměnitelná třída | Bit 3 | 0 | (Výchozí) Nelze vyměnit | ||
1 | Tuto třídu lze volitelně smazat, aniž by to ovlivnilo fungování programu (platí pouze pro typy ED) | ||||
Bity 4-6 | Rezervováno | ||||
Rezervujte si extra prostor | Bit 7 | 0 | Není rezervováno žádné další místo | ||
1 | Rezervujte 16 bajtů prostoru na začátku třídy (pouze typ ED třídy MRG) | ||||
42 | 1 | Vyplňte hodnotu | Hodnota Fill byte, pokud je nastaven příznak Fill Present | ||
43 | 1 | 0 | Rezervováno | ||
44-47 | 4 | Přidružená data | Binární | Používá se pro ID prostředí nebo statické oblasti pro položky LD pomocí XLINK | |
48-51 | 4 | Přednost | Binární | Pořadí řazení položek PR | |
52-59 | 8 | 0 | Rezervováno | ||
60-69 | 10 | Atributy chování | Atributy chování pro tuto položku (viz Tabulka atributů chování níže) | ||
70-71 | 2 | Délka jména | Binární | Délka názvu této položky; nemůže být nula | |
72- | název | Text | Název této položky se zkrácenými koncovými mezerami. Musí mít alespoň jeden znak; Soukromý kód se skládá z jednoho prázdného místa. Název rozlišuje velká a malá písmena. | ||
REM | 0 | Trailer: Nevyužité místo, pokud je potřeba pro záznamy pevné velikosti; musí být vyplněna nula. Není nutné v záznamech s proměnnou délkou. |
Pokračování
V případě záznamů pevné délky, kde název vyžaduje pokračovací záznamy, se používá následující:
Bajty | Velikost | Pole | Hodnota | Účel | |
---|---|---|---|---|---|
0-2 | 3 | PTV | X'030200 ' | Záznam pokračování ESD bez dalších pokračování | |
X'030300 ' | Záznam pokračování ESD, který pokračuje dalším záznamem | ||||
3- | název | Text | Zbytek jména, pokud tento záznam nepokračuje, nebo dalších 77 bajtů jména, pokud pokračuje. | ||
REM | 0 | Zbývající část záznamu s pevnou délkou delší než dodaná data. Obsahuje koncové bajty, pokud se jedná o poslední záznam pro tento název a název je kratší než velikost záznamu; musí být 0 vyplněno. Toto pole není v záznamech s proměnnou délkou. |
Atributy chování
Ofset | Velikost (bajty) | Bity | Pole | Hodnota | Účel | |||||
---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | Adresování vlastností | Režim adresování spojený s tímto externím symbolem. Tyto hodnoty používá také AMODE pole KONEC záznam. | |||||||
00 | AMODE není zadán (výchozí nastavení je AMODE (24)) | |||||||||
01 | AMODE (24) | |||||||||
02 | AMODE (31) | |||||||||
03 | AMODE (ANY) (24 nebo 31) | |||||||||
04 | AMODE (64) | |||||||||
10 | AMODE (MIN) (Použijte nejmenší AMODE používaný všemi moduly) | |||||||||
1 | 1 | Vlastnosti rezidence | Režim přidruženého pobytu externích symbolů | |||||||
00 | RMODE není zadán (výchozí je RMODE (24)) | |||||||||
01 | RMODE (24) | |||||||||
03 | RMODE (31) (ekvivalent RMODE (ANY)) | |||||||||
04 | RMODE (64) | |||||||||
2 | 1 | 0-3 (4) | Styl záznamu textu | Styl textu pro tuto třídu (pouze typy ED a PR) Veškerý text musí mít stejný styl | ||||||
0000 | Byte-orientovaný | |||||||||
0001 | Strukturovaná data (orientovaná na pořadače) | |||||||||
0010 | Strukturovaná data (definovaná uživatelem) | |||||||||
4-7 (4) | Závazný algoritmus | Metoda datové vazby | ||||||||
0000 | Zřetězit všechny položky jeden po druhém | |||||||||
0001 | Sloučit (všechny shodně pojmenované položky budou umístěny ve stejném prostoru, s použitím největší určené velikosti a nejpřísnějšího zarovnání). Různě pojmenované položky budou zřetězeny. Toto je obvyklá praxe pro typy CM a PR. | |||||||||
3 | 1 | 0-2 (3) | Chování úkolů | Údaj, zda je modul znovu zadán nebo opakovaně použitelný | ||||||
000 | Nespecifikováno | |||||||||
001 | Ani opakovaně použitelné, ani reentrantní (NON-REUS) | |||||||||
010 | Sériově opakovaně použitelné (REUS) | |||||||||
011 | Reentrant (RENT), také implikuje (REUS) | |||||||||
3 | 0 | Rezervováno | ||||||||
4 | Pouze ke čtení | 0 | Není pouze pro čtení | |||||||
1 | Pouze ke čtení | |||||||||
5-7 (3) | Spustitelný | 000 | Nespecifikováno | |||||||
001 | Nelze spustit (pouze data) | |||||||||
010 | Spustitelný soubor (kód nebo kód a data) | |||||||||
4 | 1 | 0-1 (2) | 0 | Rezervováno | ||||||
2-3 (2) | Závažnost duplicitních symbolů | Úroveň chyby, kterou by měl duplicitní symbol zvýšit (pouze záznamy typu PR) | ||||||||
00 | Binder určuje závažnost | |||||||||
01 | Minimum 4 (Varování) | |||||||||
10 | Minimum 8 (chyba) | |||||||||
11 | Rezervováno | |||||||||
4-7 (4) | Síla vazby | Slabé odkazy nebudou prohledávat jiné knihovny; Silné odkazy vyhledají symbol v jiných knihovnách. Silné definice lze vyřešit na jakýkoli odkaz; toto je výchozí. | ||||||||
0000 | Silný | |||||||||
0001 | Slabý | |||||||||
5 | 1 | 0-1 (2) | Chování při načítání třídy | Určuje, zda se načtou prvky třídy v případě použití požadavku LOAD operačního systému s ohledem na objekt | ||||||
00 | LOAD - Načíst tuto třídu | |||||||||
01 | ODLOŽENÉ ZATÍŽENÍ - Tato třída bude pravděpodobně použita a měla by být načtena | |||||||||
10 | NOLOAD - Tuto třídu nenačíst | |||||||||
11 | Rezervováno | |||||||||
2 | Společná vlajka | Pokud 1, považovat za „starý“ typ CM běžný, kde více odkazů nastaví velikost na největší plochu používanou jakýmkoli odkazem. Typ SD se stejným názvem zachová velikost a text. Jediný podporovaný textový typ je B_TEXT. | ||||||||
3 | Přímá vs. nepřímá reference | 0 | Přímé odkazy (pro účely pořadače) | |||||||
1 | Pro typ PR je to deskriptor vazby; pro typ ER je to odkaz na deskriptor propojení XPLINK | |||||||||
4-7 (4) | Závazný rozsah | 0000 | Nespecifikováno | |||||||
0001 | Rozsah oddílu („místní“) | |||||||||
0010 | Rozsah modulu („globální“) | |||||||||
0011 | Rozsah knihovny | |||||||||
0100 | Rozsah importu a exportu | |||||||||
6 | 1 | 0-1 (2) | Rezervováno | |||||||
2 | Typ propojení | Pro typy ER, LD, PD a PR | ||||||||
0 | Standardní propojení O / S (výchozí) | |||||||||
1 | Propojení XPLINK | |||||||||
3-7 (5) | Zarovnání | Implikované zarovnání této položky | ||||||||
00000 | Byte | |||||||||
00001 | Půl slova | |||||||||
00010 | Fullword | |||||||||
00011 | Doubleword | |||||||||
00100 | Čtyřslovo | |||||||||
00101 | Stránka 4KB | |||||||||
Všechna zobrazená zarovnání jsou k dispozici pro typy ED a PR, kromě toho, že PR nemůže použít zarovnání stránky | ||||||||||
7-9 | 3 | Rezervováno |
Záznamy ADATA
Záznamy ADATA („přidružená data“) se používají k poskytnutí dalších symbolických informací o modulu. Nahradili starší záznamy SYM ve formátu souboru objektu 360. Chcete-li vytvořit záznam ADATA
- Vytvořte záznam ESD typu ED pro název třídy, jehož jsou záznamy součástí
- Nastavte všechna pole v Atributy chování záznam na 0 kromě
- Načítání třídy (bity 0-1 bajtu 5) je X'10 '
- Vazební algoritmus je 0
- Styl záznamu textu (bity 0-3 bajtu 2) je X'0010 '
- Volitelně nastavte Pouze ke čtení (bit 4 bajtu 3) a Nelze spustit (bity 5-7 bajtu 3) hodnoty, pokud je to vhodné
- Vytvořte záznam TXT pro každou položku ADATA
- Prvek ESDID je hodnota záznamu ADATA ED pro tuto konkrétní položku ADATA
- Ofset je nula
- Délka dat je délka záznamu ADATA
- Data pole obsahuje samotný samotný záznam ADATA
Záznamy ADATA budou připojeny na konec třídy v pořadí, v jakém jsou deklarovány.
Názvy tříd přiřazené záznamům ADATA jsou programy IBM přeloženy převedením binární hodnoty na text a připojením k názvu C_ADATA„Takže položka s číslem X'0033 'se stane textovým řetězcem C_ADATA0033.
Typ | Popis |
X'0000 '- X'7FFF' | Záznamy překladače (všimněte si, že některé hodnoty v rozsahu 0-X'0130 'používají některé produkty překladačů jazyků IBM, včetně Assembler, Cobol a PL / I. ). |
X'8000 '- X'8FFF' | Záznamy správy programu |
X'9000 '- X'DFFF' | Rezervováno |
X'E000 '- X'EFFF' | Vyhrazeno pro kompilátory a assemblery, které IBM nevydala. |
X'F000 '- X'FFFF' | K dispozici pro záznamy uživatelů. IBM nebude tyto hodnoty používat. |
TXT
Záznamy TXT specifikují pokyny strojového kódu a data, která mají být umístěna na konkrétní adresu v modulu. Všimněte si, že kdekoli musí být pro tento záznam zadána „délka“, hodnota délky musí zahrnovat veškerá pokračování tohoto záznamu.
Bajty | Velikost | Pole | Bity | Hodnota | Účel | |
---|---|---|---|---|---|---|
0-2 | 3 | PTV | X'031000 ' | Záznam TXT bez pokračování | ||
X'031100 ' | TXT záznam, který pokračuje dalším záznamem | |||||
3 | 1 | 0-3 (4) | Rezervováno | |||
Styl | 4-7 (4) | Všechny ostatní hodnoty jsou vyhrazeny | ||||
0000 | Byte Oriented Data | |||||
0001 | Strukturovaná data (aktuálně jsou podporována pouze strukturovaná data, jsou 19bajtová pole IDR; viz Tabulka údajů IDR) | |||||
0010 | Nestrukturovaná data | |||||
4-7 | 4 | Prvek ESDID | Binární číslo | ESDID, ke kterému patří obsah tohoto záznamu | ||
8-11 | 4 | Rezervováno | ||||
12-15 | 4 | Ofset | Binární adresa | Adresa v rámci ESDID, kam mají být tato data umístěna. To by mělo být 0 pro strukturovaná a nestrukturovaná data. | ||
16-19 | 4 | Skutečná délka textového pole | binární hodnota: 0 nebo plná velikost po rozšíření | Pokud je pole pro kódování textu 0, musí to být 0. Jinak je toto pole po dekompresi nebo rozbalení v plné velikosti textu | ||
20-21 | 2 | Kódování textu | binární hodnota | 0, pokud text nevyžaduje replikaci, rozbalení nebo dekódování; nenulové pro označení textu musí být dekódováno, rozbaleno nebo rozbaleno; vidět Tabulka komprese | ||
22-23 | 2 | Délka dat | binární hodnota větší než nula | Celková délka dat v tomto záznamu v bajtech jako nepodepsaná hodnota a nemůže být nula | ||
24- | Data | Vložit strojový kód a / nebo data. Pokud jsou zahrnuta data IDR, podléhají zvláštním pravidlům a požadavkům, viz Tabulka údajů IDR | ||||
REM | Není k dispozici pro záznamy s proměnnou délkou; zbývající bajty pro pevný záznam delší než zbývající data a musí to být binární nuly |
Pokračování
Bajty | Velikost | Pole | Bity | Hodnota | Účel | |
---|---|---|---|---|---|---|
0-2 | 3 | PTV | X'031200 ' | Záznam pokračování bez dalších pokračování | ||
X'031300 ' | Pokračovací záznam, který pokračuje dalším záznamem | |||||
3- | Data pokračovala z předchozího záznamu | |||||
REM | Pokud je zbytek záznamu delší než data; nula naplněna |
Tabulka komprese
Kompresní tabulka se používá, pokud jsou bajty 20–21 záznamu TXT nenulové. Hodnota R se používá k určení počtu opakování řetězce; hodnota L označuje délku textu, který se má opakovat krát „R“. To by mohlo být použito pro předběžnou inicializaci tabulek nebo polí na mezery nebo nulu nebo pro jakýkoli jiný účel, kde je užitečné vyjádřit opakovaná data jako počet opakování a hodnotu.
Bajty | Velikost | Pole | Hodnota | Účel | |
---|---|---|---|---|---|
Pokud je hodnota v bajtech 20–21 tohoto záznamu TXT 0001 | |||||
0-1 | 2 | R | Repeat Count, celé číslo bez znaménka větší než 0 | Počet opakování řetězce začínajícího v bajtu 4. | |
2-3 | 2 | L | Binární délka, celé číslo bez znaménka větší než 0 | Délka řetězce začínající v bajtu 4 | |
4- | Tětiva | Řetězec délky „L“, který se má opakovat krát „R“. | |||
Všechny ostatní hodnoty pro bajty 20–21 jsou rezervovány |
Tabulka údajů IDR
Bajty | Velikost | Pole | Hodnota | Účel | |
---|---|---|---|---|---|
0 | 1 | x'00 ' | Rezervováno | ||
1 | 1 | Typ | Typ pole IDR (všimněte si, že primární a sekundární identifikace se vztahuje k prvnímu a druhému identifikačnímu poli, která se objevují na END kartě v bývalém formátu souboru modulu objektu OS / 360.) | ||
00 | Primární identifikace; Starý formát IDR 1 | ||||
01 | Sekundární identifikace; Starý formát IDR 1 | ||||
02 | Rozšířená identifikace; Formát IDR 2 | ||||
03 | Primární identifikace; Formát IDR 3 | ||||
04 | Sekundární identifikace; Formát IDR 3 | ||||
2-3 | 2 | Délka | Binární číslo | Délka dat IDR jako celé číslo bez znaménka větší než nula | |
4+ | Data IDR podle zadaného formátu v bajtu 1 tohoto pole; viz příslušné Formát IDR tabulka pro podrobnosti |
Formát IDR 1
Všimněte si, že na rozdíl od většiny číselných hodnot uložených v souboru GOFF jsou hodnoty „verze“, „vydání“ a „trans_date“ čísla jako textové znaky místo binárních
Bajty | Velikost | Pole | Hodnota | Účel |
---|---|---|---|---|
0-9 | 10 | Překladatel | Libovolný text | Tato hodnota je tím, čím se asembler nebo kompilátor identifikuje; IBM to nazývá „hodnota PID“ nebo „hodnota ID programu“ z katalogových čísel IBM různých programů, např. překladač Cobol pro OS / VS1 se nazývá „IKFCBL00“ |
10-11 | 2 | Verze | dvě číslice | Toto je číslo verze assembleru nebo kompilátoru, 0 až 99. |
12-13 | 2 | Uvolnění | dvě číslice | Toto je část čísla vydání výše uvedeného čísla verze, také 0 až 99 |
14-18 | 5 | Trans_Date | RRRR | 5 textových znaků označujících 2místný rok a 3místný den roku, kdy byl tento modul sestaven nebo sestaven; roky 01-65 se předpokládají ve 21. století, zatímco rok 00 nebo roky větší než 65 se předpokládají ve 20. století, např. 2000 nebo 1966-1999. Tříciferný den začíná 1. ledna 001; 032 za 1. února; 060 je 1. březen ve standardních letech a 29. únor v přestupných letech; a pokračuje přes 365 k 31. prosinci ve standardních letech a 366 za přestupné roky. |
Formát IDR 2
Normálně kompilátoři a assembleri tento záznam formátu negenerují, obvykle ho vytváří pořadač.
Bajty | Velikost | Pole | Hodnota | Účel |
---|---|---|---|---|
0-3 | 4 | datum | Zabalený desítkový formulář RRRRDDDF | Datový modul byl sestaven nebo sestaven s rokem a dnem roku |
4-5 | 2 | Data_Length | Binární hodnota | Skutečná délka dalšího pole, nepodepsaná nenulová hodnota |
6-85 | 80 | IDR_Data | Formát těchto údajů nebyl zveřejněn |
Formát IDR 3
Celý text v této položce jsou znaková data; nepoužívají se žádné binární informace.
Bajty | Velikost | Pole | Hodnota | Účel |
---|---|---|---|---|
0-9 | 10 | Překladatel | Libovolná textová hodnota, kterou si kompilátor / assembler přeje použít k identifikaci (viz staré pole Překladač.) Formát IDR 1 výše) | |
10-11 | 2 | Verze | 00 až 99 | Číslo verze assembleru nebo kompilátoru |
12-13 | 2 | Uvolnění | 00 až 99 | Číslo vydání výše uvedené verze |
14=20 | 7 | Compile_Date | RRRRDDD | Rok a den roku, kdy byl program sestaven nebo sestaven (měl by mít stejný formát jako pole „Trans Date“ z Formát IDR 1 výše, kromě roku je celý čtyřmístný rok). |
21-29 | 9 | Compile_Time | HHMMSSTTT | Hodina, minuta, sekunda a tisícina sekundy, kdy byl program sestaven nebo sestaven |
RLD
Záznamy RLD umožňují modulu zobrazit, kde odkazuje na adresu, která musí být přemístěna, například odkazy na konkrétní umístění sama o sobě nebo na externí moduly.
Bajty | Velikost | Pole | Hodnota | Účel |
---|---|---|---|---|
0-2 | 3 | PTV | X'032000 ' | Záznam nepokračuje |
X'032100 ' | Záznam pokračuje dalším záznamem | |||
3 | 1 | Rezervováno | ||
4-5 | 2 | Délka | Binární číslo | Velikost údajů o přemístění; bez znaménka a musí být větší než nula |
6- | Relocation_Data | Údaje o přemístění; vidět Data o přemístění stůl | ||
REM | Není přítomen v záznamech s proměnnou délkou; zbytek záznamu, kde je záznam delší než data, musí být vyplněn nulou |
Data o přemístění
Bajty | Velikost | Pole | Hodnota | Účel |
---|---|---|---|---|
0-5 | 6 | Vlajky | Vlajky týkající se tohoto záznamu; vidět Vlajky tabulka hodnot | |
6-7 | 2 | Rezervováno | ||
8-11 | 4 | R_Pointer | ESDID modulu (typ ED nebo ER), který se použije jako cíl přemístění | Toto je „vzdálená“ adresa, ať už ve stejném nebo jiném modulu, kterou program potřebuje vyřešit. Toto pole je vynecháno, pokud bit 0 bajtu 0 parametru Vlajky pole je 1. |
12-15[A] | 4 | P_Pointer | ESDID modulu, který vyžaduje přemístění adresy | Toto je modul, který chce, aby jeho odkaz na vzdálený identifikátor byl změněn na správnou hodnotu. Toto pole je vynecháno, pokud bit 1 bajtu 0 parametru Vlajky pole je 1. |
16-19[B] | 4 | Ofset | Umístění v modulu specifikovaném P_Pointer, kde se nachází adresa, která má být upravena. | Toto je adresa, která má být přemístěna. Toto pole je vynecháno, pokud bit 2 bajtu 0 parametru Vlajky pole je 1. |
20-23[C] | 4 | Rezervováno | ||
24-27[C] | 4 | Rezervováno |
[A] Pokud je R_Pointer vynechán (bit 0 bajtu 0 z Vlajky pole je 1) toto pole začíná o 4 bajty níže, v bajtech 8–11.
[B] Pokud R_Pointer nebo P_Pointer (bit 1 bajtu 0 Vlajky pole je 1) je vynecháno, toto pole začíná o 4 bajty níže. Li oba pole jsou vynechána, toto pole začíná o 8 bajtů níže.
[C] Pokud R_Pointer, P_Pointer, nebo Ofset (bit 2 bajtu 0 z Vlajky pole je 1) jsou vynechány, toto pole začíná o 4 bajty níže. Pokud jsou některé z nich vynechány, začíná toto pole o 8 bajtů níže. Li Všechno z nich jsou vynechány, toto pole začíná o 12 bajtů níže.
Pro objasnění, pokud by měl modul v programu C s názvem „Basura“ vydat volání funkce „exit“, aby se sám ukončil, adresa R_Pointer by byla ESDID rutiny „exit“, zatímco P_Pointer by byl ESDID „Basura“. Pokud byla adresa ve stejném modulu (jako interní podprogramy nebo odkaz na data ve stejném modulu), R_Pointer a P_Pointer by byly stejné.
Vlajky
Bajty | Velikost | Pole | Bity | Účel |
---|---|---|---|---|
0 | 1 | Same_R_ID | 0 | 1 Pokud je hodnota R_Pointer pro tuto položku stejná jako předchozí položka v tomto záznamu; pokud ano, je hodnota R_Pointer z této položky vynechána. |
Same_P_ID | 1 | 1 Pokud je hodnota P_Pointer pro tuto položku stejná jako předchozí položka v tomto záznamu; pokud ano, je hodnota P_Pointer z této položky vynechána. | ||
Same_Offset | 2 | 1 Pokud je hodnota offsetu pro tuto položku stejná jako předchozí položka v tomto záznamu; pokud ano, je hodnota offsetu z této položky vynechána. | ||
3-4 | Rezervováno | |||
5 | Rezervováno | |||
Offset_length | 6 | 0 označuje délku 4 bajtů | ||
Citlivost režimu adresování | 7 | 0 Žádná citlivost | ||
1 Nastavte vysoké bity adresy na stejný režim jako v režimu adresování režimu R adresy R_Pointer (platí pouze pro adresy typu V) | ||||
1 | 1 | R_Pointer_Indicators | 0-3 | Datový typ druhého operandu adresy přemístění |
0 - R-adresa | ||||
1 - Posun od začátku R-adresy | ||||
2 - délka R (0 pro položky LD) | ||||
6 - Relativní okamžité (umožňující pokyny k adresování externích symbolů) | ||||
7 - R konstantní (nesdílená datová oblast) | ||||
9-20bitová adresa s dlouhým posunem | ||||
Všechny ostatní hodnoty jsou vyhrazeny | ||||
4-7 | Typ položky odkazující na hodnotu, kterou je třeba přemístit. | |||
0 - Štítek, R-ID je omezeno na LD | ||||
1 - Prvek, R-ID je omezeno na ED | ||||
2 - Třída, R-ID je omezeno na ED; Třídy nemají externí názvy, takže nemají ESDID | ||||
3 - Část, R-ID je omezeno na PR | ||||
Všechny ostatní hodnoty jsou vyhrazeny | ||||
2 | 1 | Action_or_Operation | 0-6 | Typ operace, která se má použít s druhým operandem (první operand by byl 0), výsledkem je 32bitová podepsaná hodnota, která nahradí první operand |
0 - Přidat druhý operand na první | ||||
1 - Odečíst druhý operand od prvního | ||||
Všechny ostatní hodnoty jsou vyhrazeny | ||||
Oprava / načtení cíle opravy | 7 | Určuje, zda použít nebo ignorovat cílovou hodnotu | ||
0 - Jako první operand použijte pole pro opravu / cíl | ||||
1 - Ignorovat hodnotu cílového pole použijte jako první operand hodnotu opravy; pokud žádná opravná hodnota, použijte 0 | ||||
3 | 1 | Rezervováno | ||
4 | 1 | Délka cíle | Nepodepsaná délka cílového pole v bajtech | |
5 | 1 | Rezervováno |
LEN
Záznamy LEN se používají k deklaraci délky modulu, kde nebyl v době vytvoření záznamu ESD znám, např. pro kompilátory s jedním průchodem.
Pole | Ofset | Velikost | Popis |
PTV | 0-2 | 3 | Typ záznamu X'033000 ' |
3-5 | 3 | Rezervováno | |
Délka | 6-7 | 2 | Délka položek následujících po tomto poli; hodnota musí být nenulová |
Elementy | 8- | Údaje o délce prvku; vidět Elementy tabulka níže | |
REM | Trailing data to end of record for fixed-length records, must contain binary zeroes; není k dispozici pro záznamy s proměnnou délkou. |
Elementy
V záznamu prvku s odloženou délkou nelze pokračovat ani jej rozdělit
Pole | Ofset | Velikost | Popis |
ESDID | 0-3 | 4 | ESDID prvku, na který se tato hodnota vztahuje |
4-7 | 4 | Rezervováno | |
Délka | 8-11 | 4 | Délka odkazované položky |
KONEC
KONEC musí být posledním záznamem modulu. „Vstupní bod“ se používá, když má být jako výchozí bod pro jeho provedení použita jiná adresa než začátek modulu. Používá se to buď proto, že program má nespustitelná data, která se objevují před spuštěním modulu (velmi časté u starších programátorů sestavení, protože starší verze assembleru byly mnohem pomalejší při shromažďování dat uložených v programech, jakmile byly zadány pokyny), nebo proto, že modul nejprve volá externí modul, například knihovnu run-time, aby se inicializoval.
Pole | Ofset | Velikost | Bity | Popis |
PTV | 0-2 | 3 | X'034000 '- nepokračování | |
X'034100 '- Pokračování dalšího záznamu | ||||
3 | 0-5 | 6 | Rezervováno | |
Vlajky | 6-7 | 2 | Prohlášení týkající se přítomnosti nebo nepřítomnosti vstupního bodu | |
00 - Není zadán žádný vstupní bod; všechny ostatní hodnoty v tomto záznamu jsou neplatné | ||||
01 - Vstupní bod specifikovaný ESDID | ||||
10 - Vstupní bod určený jménem | ||||
11 - Vyhrazeno | ||||
AMODE | 4 | 1 | Hodnota režimu adresování vstupního bodu; hodnoty jsou uvedeny v poli 0 pole Atributy chování stůl v ESD záznam. | |
5-7 | 3 | Rezervováno | ||
Počet záznamů | 8-11 | 4 | Počet záznamů GOFF v tomto modulu (jedná se o počet „logických“ záznamů, tj. Nepočítaje pokračování) | |
ESDID | 12-15 | 4 | Hodnota ESDID, pokud na vstupní bod odkazuje ESDID; binární nula, pokud odkazuje na jméno | |
16-19 | 4 | Rezervováno | ||
Ofset | 20-23 | 4 | Posun adresy vstupního bodu modulu; toto nelze určit pro externí (ER) vstupní bod | |
Délka jména | 24-25 | 2 | Délka jména, musí být nulová, pokud byl vstupní bod specifikován pomocí ESDID. | |
název | 26- | Název externího symbolu použitého jako vstupní bod pro tento modul; je binární nula, pokud byl vstupní bod specifikován pomocí ESDID; pokud tento záznam pokračuje, jedná se o počátečních 54 znaků jména. Toto je jediná nebinární hodnota v záznamu; bylo by to textové pole představující veřejný název vstupního bodu | ||
REM | Trailer sahající až na konec záznamu; pro záznamy s pevnou délkou by měly být binární nuly na konec záznamu; vynecháno pro proměnnou délku |
Pokračování
Pokud je název vstupního bodu zadaný v záznamu END s pevnou délkou delší než 54 bajtů nebo (je-li v tomto záznamu také pokračování) delší než dalších 77 bajtů), použije se následující záznam pokračování.
Pole | Ofset | Velikost | Popis |
PTV | 0-2 | 3 | X'034200 '- Tento pokračovací záznam nepokračuje |
X'034300 '- Tento pokračovací záznam sám pokračuje dalším záznamem | |||
název | 3- | The remaining part of the entry-point name, unless this record is continued, in which case it is the next 77 characters of the name. | |
REM | If this record is not continued, this is the trailing part of the record for fixed-length records and should be binary zeroes; not present for variable-length records |
Reference
- ^ John R. Ehrman (March 1, 2001). "How the Linkage Editor Works: A Tutorial on Object/Load Modules, Link Editors, Loaders, and What They Do for (and to) You" (PDF). IBM Silicon Valley (Santa Teresa) Laboratory, San Jose. Citováno 8. září 2019.
- ^ Správa programů OS / MVS: Pokročilá zařízení (PDF) (osmé vydání). Poughkeepsie, NY: IBM. September 2007. SA22-7644-07. Citováno 9. srpna 2013.
- ^ IBM High Level Assembler for MVS & VM & VSE Release 2 Presentation Guide (PDF). December 1995. SG24-3910-01. Archivovány od originál (PDF) dne 2016-01-23. Citováno 13. listopadu 2015.
- ^ High Level Assembler for z / OS & z / VM & z / VSE Programmer's Guide (PDF) (šesté vydání). San Jose, CA: IBM. July 2008. Appendix C. SC26-4941-05. Citováno 8. září 2019.
- ^ "RLD". www.ibm.com. IBM. Citováno 10. července 2020.