GOFF
GOFF- specifikationen (Generalized Object File Format) utvecklades för IBMs MVS -operativsystem för att ersätta IBM OS/360 Object File Format för att kompensera för svagheter i det äldre formatet.
Bakgrund
Det ursprungliga IBM OS/360 Object File Format utvecklades 1964 för den nya IBM System/360 stordatorn. Formatet användes också av tillverkare av pluggkompatibla och arbetsliknande stordatorer, inklusive Univac 90/60, 90/70 och 90/80 och Fujitsu B2800. Formatet utökades för att lägga till symboliska poster och utökad information om moduler, plus stöd för procedurer och funktioner med namn längre än 8 tecken. Även om detta hjälpte, tillhandahöll det inte den förbättrade information som behövs för dagens mer komplicerade programmeringsspråk och mer avancerade funktioner som objekt, egenskaper och metoder, Unicode-stöd och virtuella metoder .
GOFF-objektfilformatet utvecklades av IBM ungefär 1995 som ett sätt att övervinna dessa problem. Det tidigaste omnämnandet av detta format var i den inledande informationen om den nya High Level Assembler. Observera att OS/360-objektfilformatet helt enkelt ersattes av GOFF-formatet, det var inte föråldrat och används fortfarande av assemblers och språkkompilatorer där språket kan motstå begränsningarna i det äldre formatet.
Konventioner
Den här artikeln kommer att använda termen "modul" för att hänvisa till vilket namn eller motsvarande symbol som helst, som används för att tillhandahålla en identifierare för en kod eller data utanför det omfång som det refereras till . En modul kan referera till en subrutin, en funktion, Fortran Common eller Block Data, ett objekt eller klass, en metod eller egenskap för ett objekt eller klass, eller någon annan namngiven rutin eller identifierare utanför det specifika omfånget som refererar till det externa namnet.
Termerna "assembler" för ett program som konverterar assemblerspråk till maskinkod, såväl som att "assemblera" som processen att använda en, och att "kompilera", som processen att använda en "kompilator", som gör samma sak sak för högnivåspråk, bör, för syftet med denna artikel. anses utbytbara; så där "kompilera" och "kompilator" används, ersätt "sammanställa" och "sammanställare" efter behov.
Siffror som används i den här artikeln uttrycks enligt följande: såvida de inte anges som hexadecimala (bas 16), är alla tal som används i decimaler (bas 10). När det är nödvändigt för att uttrycka ett tal i hexadecimala format, skulle standardformatet för stordatorsammansättning att använda den stora bokstaven X före siffran, uttrycka eventuella hexadecimala bokstäver i siffran med versaler, och omge siffran med enkla citattecken, t.ex. siffran 15deadbeef 16 . uttryckt som X'15DEADBEEF'.
En "byte" som används i den här artikeln är 8-bitar, och om inget annat anges är en "byte" och ett "tecken" samma sak; tecken i EBCDIC är också 8-bitars. När multi-byte teckenuppsättningar (som Unicode ) används i användarprogram kommer de att använda två (eller fler) byte.
Krav och begränsningar
Formatet liknar OS/360 Object File Format men lägger till ytterligare information för användning i byggnadsapplikationer.
- GOFF-filer är antingen poster med fast eller variabel längd.
- En GOFF-post måste helt passa in i en enda post i det underliggande filsystemet. En GOFF-fil är inte en fil av typen stream .
- Poster med fast längd måste vara 80 byte. Minsta storlek på en post med variabel längd är 56 byte. När det gäller poster med fast längd, kommer det att finnas oanvända byte i slutet av en post. Dessa byte måste ställas in på binär noll.
- Programmet som läser (eller skriver) GOFF-poster ska inte göra antaganden om det interna formatet för poster, operativsystemet antas kunna tillhandahålla poster med fast eller variabel längd utan att programmet som läser dem behöver vara medveten om driften system intern filhantering. Längden på en post är inte en del av själva posten.
- Binära värden lagras i big endian- format, t.ex. värdet 1 är X'01' för ett 8-bitars värde, X'0001' för ett 16-bitars värde, X'00000001' för ett 32-bitars värde och X' 0000000000000001' för ett 64-bitars värde.
- Bitar räknas från vänster till höger; bit 0 är biten längst till vänster i en byte eller ett ord.
- Poster med fast längd krävs för GOFF-filer som distribueras på Unix -system.
- En post kan fortsätta på en efterföljande post. Om en registrering fortsätts, ska inga mellanliggande poster förekomma mellan registreringen som fortsätter och fortsättningsposten.
- En GOFF-objektfil börjar med en HDR-post och slutar med en END-post. END-posten bör inkludera antalet GOFF-poster (inte antalet fysiska poster) i filen.
- En språkkompilator eller assembler kan producera flera GOFF-filer i en kompilering/sammansättning, men de individuella GOFF-filerna måste vara åtskilda från varandra. Detta innebär att en modul eller kompileringsenhet, bestående av en HDR-post, mellanliggande ESD, TXT och andra, som avslutas med en END-post, sedan kan följas av en annan kompileringsenhet som börjar med HDR och slutar med END, och så vidare, efter behov. .
- Modul- och klassnamn är skiftlägeskänsliga. En modul med namnet "exit" (som används av C -språket) behöver inte vara samma som "EXIT" som används av Fortran -språket.
- Vissa konventioner som är tillämpliga på OS/360 Object File Format överförs till GOFF Object File Format, inklusive:
- Om inget annat anges finns alla tecken i EBCDIC -teckenuppsättningen, förutom externa namn, som anges nedan.
- ESD-poster (Huvudprogram, subrutiner, funktioner, FORTRAN Common, metoder och egenskaper i objekt) måste numreras med början med 1 och varje ny post ska ha nästa nummer i följd, utan några "luckor" i numreringssekvensen.
- En ESD-post måste definieras innan någon annan post (som en TXT- eller RLD-post) refererar till den.
- Varje ESD-post innehåller exakt en ESD-post. (Detta skiljer sig från det gamla formatet, som tillät upp till 3 ESD-objekt i varje ESD-post.)
- En RLD-post (relocation dictionary) kan innehålla en eller flera poster, och en RLD-post kan fortsätta till en efterföljande post.
- För att säkerställa framtida kompatibilitet bör fält indikerade som "reserverade" sättas till binär noll.
- Teckenuppsättningar som används för externa namn definieras inte av GOFF-standarden, men det finns en bestämmelse för en fil för att indikera vilken teckenuppsättning som används. (Detta är för att stödja dubbelbyte teckenuppsättning Unicode -baserade modulnamn.) Vissa IBM-produkter tillåter dock endast tecken för externa namn och andra identifierare inom ett begränsat intervall, vanligtvis (EBCDIC) hexadecimala värden på X'41' till X 'FE' plus tecknen för in- och utskiftning, X'0F' respektive X'0E'.
- Det nya formatet stöder klassnamn, av vilka det finns två typer, reserverade och användarlevererade eller icke-reserverade . Alla klassnamn har en maximal längd på 16 tecken.
- Reserverade klassnamn består av en enda bokstav, ett understreck och 1 till 14 tecken. Reserverade klassnamn som börjar med B_ är reserverade för pärmen; Reserverade klassnamn som börjar med C_ markerade som laddningsbara är reserverade för program skapade för användning med IBMs språkmiljö (LE). Klassnamn som börjar med C_ och som inte är markerade som laddningsbara, samt klasser som börjar med X_, Y_ eller Z_ är tillgängliga för allmänt bruk som icke-reserverade .
- Klassnamn som tillhandahålls av användaren kan vara små bokstäver.
- Klassnamn är inte externa symboler.
- Följande klasser som används av pärmen kan refereras till om det behövs för kompileringsändamål:
B_ESD | Extern symbolordboksklass |
B_TEXT | Textklass |
B_RLD | Omplaceringsordboksklass |
B_SYM | Klass för intern symboltabell |
B_IDRL | Språk-översättare identifieringsdataklass |
B_PRV | Pseudoregistreringsklass |
B_IDRU | Användarspecificerad identifieringsdataklass |
- Följande klassnamn är reserverade av bindemedlet och är inte tillgängliga för användarapplikationer:
B_IDRB | Pärmdatainformation |
B_IDRZ | SUPER-Zap datainformation |
B_IMPEXP | Import-Export Tabell |
B_LIT | Laddar informationstabell |
B_MAP | Kartläggningsdata |
- SYM-objektfilens symboliska tabellinformation från 360 Object File-formatposten är inte tillgänglig för GOFF-objektfiler; ADATA-posten (sub-post till TXT) måste användas istället.
Rekordtyper
På samma sätt som det äldre OS/360-formatet är objektfilposter uppdelade i 6 olika posttyper, några tillagda, några raderade, några ändrade:
- HDR-posten (detta är ny) måste ske först, den definierar rubriken för objektfilen.
- ESD-poster definierar huvudprogram, subrutiner, funktioner, dummysektioner, Fortran Common, metoder och egenskaper, och alla moduler eller rutiner som kan anropas av en annan modul. De används för att definiera programmen eller programsegmenten som kompilerades i denna körning av kompilatorn, och externa rutiner som används av programmet (som exit() i C , CALL EXIT i Fortran ; new( ) och dispose ( ) i Pascal ). ESD-poster bör förekomma före varje hänvisning till en ESD-symbol.
- TXT-poster har utökats, och förutom att innehålla maskininstruktioner eller data som lagras av modulen, innehåller de även identifieringsdata (IDR) poster (20 eller fler typer), associerade data (ADATA) poster och ytterligare information relaterad till modulen.
- RLD-poster används för att flytta adresser. Till exempel, ett program som hänvisar till en adress som ligger 500 byte inuti modulen, kommer internt att lagra adressen som 500, men när modulen laddas in i minnet måste den vara placerad någon annanstans, så en RLD-post informerar länkredigeraren eller laddaren om vad adresser att ändra. Dessutom, när en modul refererar till en extern symbol, kommer den vanligtvis att ställa in symbolens värde till noll, och sedan inkludera en RLD-post för den symbolen för att tillåta laddaren eller länkredigeraren att ändra adressen till rätt värde.
- LEN-poster är nya och ger viss längdinformation.
- END-poster indikerar slutet på en modul, och valfritt var programmet ska börja köras. Detta måste vara den sista posten i filen.
Formatera
GOFF-poster kan ha fast eller variabel längd; den minsta längden vid användning av poster med variabel längd är 56 tecken, även om de flesta poster kommer att vara längre än detta. Förutom modul- och klassnamn finns alla tecken i teckenuppsättningen EBCDIC . Unix-baserade system måste använda poster med fast längd (80 byte). Poster i filer med fast längd som är kortare än den fasta längden bör nollfyllas. För att skilja GOFF-poster från det äldre OS/360-objektformatet (där den första byten i en post är X'02') eller från kommandon som kan finnas i filen, är den första byten i varje GOFF-post alltid det binära värdet X '03', medan kommandon måste börja med ett teckenvärde på minst mellanslag (X'40'). De nästa 2 byten av en GOFF-post indikerar posttypen, fortsättningen och versionen av filformatet. Dessa första 3 byte är kända som PTV -fältet.
PTV
PTV-fältet representerar de första 3 byten av varje GOFF-post.
Byte | Bits | Värde | Syfte |
---|---|---|---|
0 | Allt | 03 | Indikerar början av en GOFF-post |
1 | 0-3 | 0 | ESD-post (External Symbol). |
1 | TXT (text) post | ||
2 | RLD (Omlokalisering) rekord | ||
3 | LEN (Längd) rekord | ||
4 | END (Slut) post | ||
X'5'-X'E' | Reserverad | ||
X'F' | HDR (Header) rekord | ||
4-5 | Reserverad | ||
6-7 | 00 | Inledande post som inte fortsätter på nästa post. Detta bör vara det enda värdet som används för GOFF-poster med variabel längd | |
01 | Inledande rekord som fortsätter på nästa skiva | ||
10 | Fortsättningsposten fortsätter inte på nästa post | ||
11 | Fortsättningsrekord som fortsätter på nästa post | ||
2 | Allt | 00 | Versionsnummer för objektfilformatet. Alla värden utom X'00' är reserverade |
HDR
HDR-posten krävs och måste vara den första posten.
Byte(ar) | Storlek | Fält | Värde | Syfte |
---|---|---|---|---|
0-2 | 3 | PTV | X'03F000' | Endast tillåtet värde; HDR-inspelning kan för närvarande inte fortsätta |
3-47 | 45 | 0 | Reserverad | |
48-51 | 4 | Arkitektur nivå | Binär 0 eller 1 | GOFF arkitekturnivå; alla värden utom 0 och 1 är reserverade |
52-53 | 2 | Modulegenskaper Storlek | binär | Längd på fältet Modulegenskaper |
54-59 | 6 | 0 | Reserverad | |
60- | 0+ | Modulegenskaper | Lista över modulegenskaper (valfritt) |
ESD
En ESD-post ger det offentliga namnet för en modul, ett huvudprogram, en subrutin, procedur, funktion, egenskap eller metod i ett objekt, Fortran Common eller alternativ ingångspunkt. En ESD-post för ett offentligt namn måste finnas i filen innan någon hänvisning till det namnet görs av någon annan post.
Byte(ar) | Storlek | Fält | Värde (eller bitar) | Syfte | |
---|---|---|---|---|---|
0-2 | 3 | PTV | X'030000' | ESD-post utan fortsättningar | |
X'030100' | ESD-post som fortsätter på nästa skiva | ||||
3 | 1 | Symboltyp | 00 | SD - Sektionsdefinition; Detta används för de tidigare värdena SD, CM (Common) och PC (Privat Code, ett SD vars namn är tomt). "Prent" ESDID-värdet måste vara 0. Detta används för att definiera ett huvudprogram, en subrutin eller funktion för vilken koden är en del av denna fil. Används även för Fortran Common. | |
01 | ED - Extern definition. "Förälder" ESDID måste vara icke-noll och vara värdet på en SD-post som refererar till denna externa symbol. Om ett RLD-värde hänvisar till en klass som denna post tillhör, måste klassen som detta element refererar till anges i fältet Externt namn. Detta används för att namnge en anropad procedur eller funktion. | ||||
02 | LD - Etikettdefinition. "Förälder" ESDID måste vara icke-noll och vara värdet på en SD-post som definierar denna symbol i sig själv. Detta kan användas för att skapa ett alias för modulen eller för att exponera en del av den som en separat rutin. Till exempel kan runtime-biblioteket för ett visst programmeringsspråk ha vissa funktioner som det måste använda sig av, men som är användbara av program som är skrivna med det språket, och därför kan en funktion ges en etikett så att den kan anropas direkt. Till exempel kan det finnas ett komplett matematikpaket som en enda modul, och alla standardfunktioner (sinus, cosinus, kvadratrot, etc.) kan benämnas ingångspunkter i den modulen. | ||||
03 | PR - Delreferens eller Pseudoregister. Utmärks av fältet Name Space ID. "Förälder" ESDID måste vara icke-noll och vara värdet på en SD-post som definierar denna symbol i sig själv. | ||||
04 | ER och WX - Extern referens / Svag extern referens. Utmärks av värdet "Bindande styrka" i fältet "Attribut". WX används där den främmande rutinen kan saknas. Till exempel, om ett kalkylatorprogram hade ett snabbt högpresterande matematikpaket som var valfritt, kunde det kallas som ett WX, och om det saknades eller inte var tillgängligt, kan programmet nedgraderas till ett mindre matematikpaket. | ||||
4-7 | 4 | ESDID | Binär | ESDID-identifierare som börjar med 1. Varje nytt ESDID måste vara exakt 1 högre än den föregående posten. | |
8-11 | 4 | Förälder ESDID | binär | Detta är ESDID för objektet som definierar denna post, om det är en del av ett annat objekt. Den är 0 om den inte har någon förälder. | |
12-15 | 4 | 0 | Reserverad | ||
16-19 | 4 | Offset | Binär | Adress till denna symbol inom dess överordnade ESDID för LD- eller ED-poster; noll annars. | |
20-23 | 4 | 0 | Reserverad | ||
24-27 | 4 | Längd | Binär | Längd på denna artikel för ED- och PR-typer; noll annars. Om det faktiska längdvärdet skjuts upp; detta värde är satt till -1. | |
28-31 | 4 | Utökat attribut ESDID | Binär | ESDID för element som innehåller utökad attributinformation för ED- och LD-typer; används vanligtvis där DLL-filer stöds för symboler som löses vid körning (som virtuella metoder). Noll annars. | |
32-35 | 4 | Utökad attributoffset | Binär | Adress där utökade attribut kan hittas för föregående fält, används för ED- och LD-poster med utökade attribut; noll annars. | |
36-39 | 4 | 0 | Reserverad | ||
40 | 1 | Namn Space ID | Identifierar namnutrymmet som detta tillhör | ||
0 | Reserverad för Program Management Binder | ||||
1 | Normalt namn | ||||
2 | Pseudoregister | ||||
3 | Delar (externa poster tilldelat utrymme inklusive objekt som innehåller initierade statiska data) | ||||
41 | 1 | Flaggor | |||
Fyll Present | Bit 0 | 0 | Ingen fyllning | ||
1 | Fyll byte närvarande (endast giltigt för ED-typer) | ||||
Manglad | Bit 1 | 0 | Symbolen är inte skadad | ||
1 | Symbolen kan vara manglad | ||||
Kan ändra namn | Bit 2 | 0 | Kan inte döpas om (samma som "mappad" flagga i XOBJ) | ||
1 | Symbol kan byta namn (Kan delta i språkmiljö (LE) typ byta namn) | ||||
Avtagbar klass | Bit 3 | 0 | (Standard) Ej borttagbar | ||
1 | Denna klass kan valfritt tas bort utan att det påverkar programmets funktion (gäller endast ED-typer) | ||||
Bits 4-6 | Reserverad | ||||
Boka extra utrymme | Bit 7 | 0 | Inget extra utrymme reserverat | ||
1 | Reservera 16 byte utrymme i början av klassen (endast MRG-klass ED-typ) | ||||
42 | 1 | Fyll värde | Värde på Fill byte, om Fill Present-flaggan är inställd | ||
43 | 1 | 0 | Reserverad | ||
44-47 | 4 | Tillhörande data | Binär | Används för ID för miljö eller statiskt område för LD-artiklar med XLINK | |
48-51 | 4 | Prioritet | Binär | Sorteringsordning av PR-artiklar | |
52-59 | 8 | 0 | Reserverad | ||
60-69 | 10 | Beteendeegenskaper | Beteendeattribut för detta objekt (se tabellen Beteendeattribut nedan) | ||
70-71 | 2 | Namn Längd | Binär | Längden på denna artikels namn; kan inte vara noll | |
72- | namn | Text | Namnet på denna artikel med efterföljande ämnen trunkerade. Måste vara minst ett tecken; Privat kod består av ett enda ämne. Namnet är skiftlägeskänsligt. | ||
REM | 0 | Trailer: Oanvänt utrymme om det behövs för poster i fast storlek; måste fyllas i noll. Behövs inte i poster med variabel längd. |
Fortsättning
När det gäller skivor med fast längd där namnet kräver fortsättningsposter används följande:
Byte(ar) | Storlek | Fält | Värde | Syfte | |
---|---|---|---|---|---|
0-2 | 3 | PTV | X'030200' | ESD-fortsättningspost utan ytterligare fortsättningar | |
X'030300' | ESD fortsättningspost som fortsätter på nästa post | ||||
3- | namn | Text | Resten av namnet om denna post inte fortsätter, eller nästa 77 byte av namnet om den fortsätter. | ||
REM | 0 | Återstoden för en post med fast längd som är längre än de uppgifter som tillhandahålls. Den innehåller de avslutande byten om detta är den sista posten för detta namn och namnet är kortare än poststorleken; måste vara 0 ifylld. Det här fältet finns inte i poster med variabel längd. |
Beteendeattribut
Offset | Storlek (Byte) | Bits | Fält | Värde | Syfte | |||||
---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | Adressegenskaper | Adresseringsläge associerat med denna externa symbol. Dessa värden används också av AMODE -fältet i END -posten. | |||||||
00 | AMODE inte specificerad (standard är AMODE (24)) | |||||||||
01 | AMODE(24) | |||||||||
02 | AMODE(31) | |||||||||
03 | AMODE(NÅGON) (24 eller 31) | |||||||||
04 | AMODE(64) | |||||||||
10 | AMODE(MIN) (Använd den minsta AMODE som används av alla moduler) | |||||||||
1 | 1 | Bostadsfastigheter | Extern symbols associerade uppehållsläge | |||||||
00 | RMODE inte specificerad (standard är RMODE (24)) | |||||||||
01 | RMODE(24) | |||||||||
03 | RMODE(31) (motsvarar RMODE(NÅGON)) | |||||||||
04 | RMODE(64) | |||||||||
2 | 1 | 0-3 (4) | Text Record Style | Textstil för denna klass (endast ED- och PR-typer) All text måste ha samma stil | ||||||
0000 | Byte-orienterad | |||||||||
0001 | Strukturerad data (Binder Oriented) | |||||||||
0010 | Strukturerad data (användardefinierad) | |||||||||
4-7 (4) | Bindande algoritm | Databindningsmetod | ||||||||
0000 | Sammanfoga alla objekt efter varandra | |||||||||
0001 | Sammanfoga (alla identiskt namngivna objekt kommer att placeras på samma utrymme, med den största storleken angivna och mest restriktiva justeringen). Objekt med olika namn kommer att sammanfogas. Detta är den vanliga metoden för CM- och PR-typer. | |||||||||
3 | 1 | 0-2 (3) | Uppgiftsbeteende | Indikering om modulen är återinträdande och/eller återanvändbar | ||||||
000 | Ospecificerad | |||||||||
001 | Varken återanvändbar eller återanvändbar (icke-REUS) | |||||||||
010 | Seriellt återanvändbar (REUS) | |||||||||
011 | Reentrant (RENT), innebär också (REUS) | |||||||||
3 | 0 | Reserverad | ||||||||
4 | Endast läs | 0 | Inte endast läs | |||||||
1 | Endast läs | |||||||||
5-7 (3) | Körbar | 000 | Ej angivet | |||||||
001 | Ej körbar (endast data) | |||||||||
010 | Körbar (kod eller kod och data) | |||||||||
4 | 1 | 0-1 (2) | 0 | Reserverad | ||||||
2-3 (2) | Duplikatsymbolens svårighetsgrad | Felnivån som en dubblettsymbol bör höja (endast PR-poster) | ||||||||
00 | Pärm bestämmer svårighetsgraden | |||||||||
01 | Minst 4 (varning) | |||||||||
10 | Minst 8 (fel) | |||||||||
11 | Reserverad | |||||||||
4-7 (4) | Bindande styrka | Svaga referenser kommer inte att söka i andra bibliotek; Starka referenser kommer att söka efter symbolen i andra bibliotek. Starka definitioner kan lösas till vilken referens som helst; detta är standard. | ||||||||
0000 | Stark | |||||||||
0001 | Svag | |||||||||
5 | 1 | 0-1 (2) | Klassladdningsbeteende | Bestämmer om elementen i en klass kommer att laddas om ett operativsystem LOAD-begäran används med avseende på ett objekt | ||||||
00 | LOAD - Ladda denna klass | |||||||||
01 | UPPDRAD LASTNING - Den här klassen kommer förmodligen att användas och bör laddas | |||||||||
10 | NOLOAD - Ladda inte denna klass | |||||||||
11 | Reserverad | |||||||||
2 | Gemensam flagga | Om 1, behandla som "gammal" CM-typ COMMON där flera referenser anger storleken på det största området som används av någon referens. En SD-typ med samma namn kommer att behålla storleken och texten. Den enda texttyp som stöds för detta är B_TEXT. | ||||||||
3 | Direkt vs. Indirekt referens | 0 | Direkta referenser (för pärmen) | |||||||
1 | För PR-typ är detta en länkbeskrivning; för ER-typ är detta en referens till en XPLINK-kopplingsbeskrivning | |||||||||
4-7 (4) | Bindande omfattning | 0000 | Ospecificerad | |||||||
0001 | Avsnittsomfång ("lokalt") | |||||||||
0010 | Modulomfattning ("global") | |||||||||
0011 | Bibliotekets omfattning | |||||||||
0100 | Import-Export omfattning | |||||||||
6 | 1 | 0-1 (2) | Reserverad | |||||||
2 | Länktyp | För typerna ER, LD, PD och PR | ||||||||
0 | Standard O/S länkage (standard) | |||||||||
1 | XPLINK-koppling | |||||||||
3-7 (5) | Inriktning | Underförstådd justering av detta objekt | ||||||||
00 000 | Byte | |||||||||
00001 | Halvord | |||||||||
00010 | Fullword | |||||||||
00011 | Dubbelord | |||||||||
00100 | Quadword | |||||||||
00101 | 4KB sida | |||||||||
Alla visade justeringar är tillgängliga för ED- och PR-typer, förutom att PR inte kan använda sidjustering | ||||||||||
7-9 | 3 | Reserverad |
ADATA-poster
ADATA ("associerade data")-poster används för att tillhandahålla ytterligare symbolinformation om en modul. De ersatte de äldre SYM-posterna i 360-objektfilformatet. För att skapa en ADATA-post
- Skapa en ESD-post av typen ED för klassnamnet som posterna ingår i
- Ställ in alla fält i posten Behavioral Attributes till 0 utom
- Klassladdning (bitar 0-1 av byte 5) är X'10'
- Bindningsalgoritmen är 0
- Text Record Style (bitar 0-3 av byte 2) är X'0010'
- Ställ eventuellt in skrivskyddad (bit 4 av byte 3) och Not Executable (bitar 5-7 i byte 3) om så är lämpligt
- Skapa en TXT-post för varje ADATA-objekt
- Element ESDID är värdet på ADATA ED-posten för just den ADATA-posten
- Offset är noll
- Data Length är längden på ADATA-posten
- Datafältet innehåller själva ADATA-posten
ADATA-poster kommer att läggas till i slutet av klassen i den ordning de deklareras.
Klassnamn som tilldelats ADATA-poster översätts av IBM-program genom att konvertera det binära värdet till text och lägga till det i namnet C_ADATA , så ett objekt numrerat X'0033' skulle bli textsträngen C_ADATA0033 .
Typ | Beskrivning |
X'0000' - X'7FFF' | Översättarposter (observera att vissa värden i intervallet 0-X'0130' används av vissa IBM-språköversättarprodukter inklusive Assembler, Cobol och PL/I ). |
X'8000' - X'8FFF' | Program Management poster |
X'9000' - X'DFFF' | Reserverad |
X'E000' - X'EFFF' | Reserverat för kompilatorer och assemblerare som inte har släppts av IBM. |
X'F000' - X'FFFF' | Tillgänglig för användarregister. IBM kommer inte att använda dessa värden. |
Text
TXT-poster anger maskinkodinstruktioner och data som ska placeras på en specifik adressplats i modulen. Observera att varhelst en "längd" måste anges för denna post, måste längdvärdet inkludera eventuella fortsättningar till denna post.
Byte(ar) | Storlek | Fält | Bits | Värde | Syfte | |
---|---|---|---|---|---|---|
0-2 | 3 | PTV | X'031000' | TXT-post utan fortsättningar | ||
X'031100' | TXT-post som fortsätter på nästa post | |||||
3 | 1 | 0-3 (4) | Reserverad | |||
Stil | 4-7 (4) | Alla andra värden är reserverade | ||||
0000 | Byteorienterad data | |||||
0001 | Strukturerad data (för närvarande är de enda strukturerade data som stöds de 19-byte IDR-fälten; se IDR-datatabellen ) | |||||
0010 | Ostrukturerad data | |||||
4-7 | 4 | Element ESDID | Binärt tal | ESDID som innehållet i denna post tillhör | ||
8-11 | 4 | Reserverad | ||||
12-15 | 4 | Offset | Binär adress | Adress inom ESDID där denna data ska placeras. Detta bör vara 0 för strukturerad och ostrukturerad data. | ||
16-19 | 4 | Textfältets sanna längd | binärt värde: 0 eller full storlek efter expansion | Om textkodningsfältet är 0 måste detta vara 0. Annars är detta fält i full storlek på texten efter dekomprimering eller uppackning | ||
20-21 | 2 | Textkodning | binärt värde | 0 om text inte kräver replikering, uppackning eller avkodning; icke-noll för att indikera att text måste avkodas, packas upp eller utökas; se Kompressionstabell | ||
22-23 | 2 | Datalängd | binärt värde större än noll | Den totala längden av data på denna post i byte som ett värde utan tecken och får inte vara noll | ||
24- | Data | Maskinkod och/eller data som ska infogas. Om IDR-data ingår är det föremål för särskilda regler och krav, se IDR-datatabellen | ||||
REM | Finns inte för poster med variabel längd; återstående byte för fast post längre än återstående data, och måste vara binära nollor |
Fortsättning
Byte(ar) | Storlek | Fält | Bits | Värde | Syfte | |
---|---|---|---|---|---|---|
0-2 | 3 | PTV | X'031200' | Fortsättningsprotokoll utan ytterligare fortsättningar | ||
X'031300' | Fortsättningsrekord som fortsätter nästa rekord | |||||
3- | Data fortsatte från tidigare rekord | |||||
REM | Om återstoden av posten är längre än data; noll fylld |
Kompressionstabell
En komprimeringstabell används om byte 20-21 i TXT-posten inte är noll. R-värdet används för att bestämma hur många gånger strängen ska upprepas; L-värdet anger längden på texten som ska upprepas "R" gånger. Detta kan användas för att förinitiera tabeller eller arrayer till tomma eller noll eller för något annat ändamål där det är användbart att uttrycka upprepade data som en upprepningsräkning och ett värde.
Byte(ar) | Storlek | Fält | Värde | Syfte | |
---|---|---|---|---|---|
Om värdet i byte 20-21 i denna TXT-post är 0001 | |||||
0-1 | 2 | R | Repeat Count, ett heltal utan tecken som är större än 0 | Antal gånger för att upprepa strängen med början i byte 4. | |
2-3 | 2 | L | Binär längd, ett heltal utan tecken som är större än 0 | Längd på sträng som börjar i byte 4 | |
4- | Sträng | Strängen, med längden "L" som ska upprepas "R" gånger. | |||
Alla andra värden för byte 20-21 är reserverade |
IDR-datatabell
IDR-tabellen, som finns från byte 24 i TXT-posten, identifierar kompilatorn eller assemblern (och dess versionsnummer) som skapade den här objektfilen.
Byte(ar) | Storlek | Fält | Värde | Syfte | |
---|---|---|---|---|---|
0 | 1 | x'00' | Reserverad | ||
1 | 1 | Typ | Typ av IDR-fält (observera att primär och sekundär identifiering hänvisar till det första respektive andra identifieringsfältet som visas på END-kortet i det tidigare OS/360 Object Module File Format.) | ||
00 | Primär identifiering; Gammalt IDR-format 1 | ||||
01 | Sekundär identifiering; Gammalt IDR-format 1 | ||||
02 | Utökad identifiering; IDR-format 2 | ||||
03 | Primär identifiering; IDR-format 3 | ||||
04 | Sekundär identifiering; IDR-format 3 | ||||
2-3 | 2 | Längd | Binärt tal | Längden på IDR-data som osignerat heltal större än noll | |
4+ | IDR-data enligt det specificerade formatet i byte 1 i detta fält; se lämplig IDR-formattabell för detaljer |
IDR-format 1
Observera att till skillnad från de flesta siffervärden som lagras i en GOFF-fil, är "version", "release" och "trans_date" värdena siffror som texttecken istället för binära
Byte(ar) | Storlek | Fält | Värde | Syfte |
---|---|---|---|---|
0-9 | 10 | Översättare | Vilken text som helst | Detta värde är vad assemblern eller kompilatorn identifierar sig som; IBM kallar detta "PID-värde" eller "Program ID-värde" från IBMs katalognummer för olika program, t.ex. Cobol-kompilatorn för OS/VS1 heter "IKFCBL00" |
10-11 | 2 | Version | två siffror | Detta är versionsnumret för assemblern eller kompilatorn, 0 till 99. |
12-13 | 2 | Släpp | två siffror | Detta är underdelen av versionsnumret ovan, även 0 till 99 |
14-18 | 5 | Trans_Date | ÅÅÅÅÅ | 5 texttecken som indikerar det 2-siffriga året och den 3-siffriga dagen på året denna modul kompilerades eller monterades; år 01-65 antas vara under 2000-talet, medan år 00 eller år över 65 antas vara under 20-talet, t.ex. 2000 eller 1966-1999. Den tresiffriga dagen börjar vid 001 för 1 januari; 032 för 1 februari; 060 är 1 mars i normalår och 29 februari under skottår; och fortsätter genom 365 för den 31 december under standardår och 366 för skottår. |
IDR-format 2
Normalt genererar inte kompilatorer och sammanställare den här formatposten, den skapas vanligtvis av bindaren.
Byte(ar) | Storlek | Fält | Värde | Syfte |
---|---|---|---|---|
0-3 | 4 | Datum | Packad decimalform ÅÅÅÅDDDF | Datummodulen sattes ihop eller kompilerades, med år och dag på året |
4-5 | 2 | Data_Length | Binärt värde | Faktisk längd på nästa fält, ett osignerat värde som inte är noll |
6-85 | 80 | IDR_Data | Formatet på denna data har inte avslöjats |
IDR-format 3
All text i detta objekt är teckendata; ingen binär information används.
Byte(ar) | Storlek | Fält | Värde | Syfte |
---|---|---|---|---|
0-9 | 10 | Översättare | Alla textvärden som kompilatorn/assemblerförfattaren vill använda för att identifiera sig själv (se fältet Översättare i gamla IDR-format 1 ovan) | |
10-11 | 2 | Version | 00 till 99 | Versionsnummer för assemblern eller kompilatorn |
12-13 | 2 | Släpp | 00 till 99 | Releasenummer för ovanstående version |
14=20 | 7 | Compile_Date | ÅÅÅÅÅ | År och dag på året som programmet kompilerades eller sammanställdes (detta skulle vara samma format som fältet "Trans Date" från IDR Format 1 ovan, förutom att året är ett helt 4-siffrigt år). |
21-29 | 9 | Compile_Time | HHMMSSTTT | Timme, minut, sekund och tusendels sekund som programmet kompilerades eller sattes ihop |
RLD
RLD-poster tillåter en modul att visa var den refererar till en adress som måste flyttas, till exempel referenser till specifika platser i sig eller till externa moduler.
Byte(ar) | Storlek | Fält | Värde | Syfte |
---|---|---|---|---|
0-2 | 3 | PTV | X'032000' | Rekordet fortsätter inte |
X'032100' | Inspelningen fortsätter på nästa skiva | |||
3 | 1 | Reserverad | ||
4-5 | 2 | Längd | Binärt nummer | Storlek på omlokaliseringsdata; osignerad och måste vara större än noll |
6- | Relocation_Data | Omlokaliseringsuppgifterna; se tabellen Flyttdata | ||
REM | Finns inte på skivor med variabel längd; resten av posten där posten är längre än data måste nollfyllas |
Flyttdata
Byte(ar) | Storlek | Fält | Värde | Syfte |
---|---|---|---|---|
0-5 | 6 | Flaggor | Flaggor angående denna post; se flaggningstabellen för värden | |
6-7 | 2 | Reserverad | ||
8-11 | 4 | R_Pointer | ESDID för modulen (typ ED eller ER) att använda som mål att flytta | Detta är den "avlägsna" adressen, antingen i samma eller en annan modul, som programmet behöver lösa. Detta fält utelämnas om bit 0 i byte 0 i Flaggor är 1. |
12-15 [A] | 4 | P_Pointer | ESDID för modulen som kräver att adressen flyttas | Det här är modulen som vill att dess referens till en avlägsen identifierare ska ändras till rätt värde. Detta fält utelämnas om bit 1 i byte 0 i Flaggor är 1. |
16-19 [B] | 4 | Offset | Plats inom modulen specificerad av P_Pointer där adressen som ska justeras finns. | Det här är adressen som ska flyttas. Detta fält utelämnas om bit 2 i byte 0 i Flaggor är 1. |
20-23 [C] | 4 | Reserverad | ||
24-27 [C] | 4 | Reserverad |
[A] Om R_Pointer (bit 0 i byte 0 i Flags -fältet är 1) utelämnas, börjar detta fält 4 byte lägre, i byte 8-11. [B] Om R_Pointer eller P_Pointer (bit 1 i byte 0 i Flags -fältet är 1) utelämnas, börjar detta fält 4 byte lägre, i byte 12-15. Om båda fälten utelämnas börjar detta fält 8 byte lägre, i byte 8-11. [C] Om R_Pointer, P_Pointer eller Offset (bit 2 i byte 0 i Flags -fältet är 1) utelämnas, börjar detta fält 4 byte lägre. Om två av dem utelämnas börjar detta fält 8 byte lägre. Om alla utelämnas börjar detta fält 12 byte lägre.
För att förtydliga, om en modul i ett C-program med namnet "Basura" skulle göra ett anrop till "exit"-funktionen för att avsluta sig själv, skulle R_Pointer-adressen vara ESDID för rutinen "exit" medan P_Pointer skulle vara ESDID för "Basura". Om adressen var i samma modul (som interna subrutiner, eller en referens till data inom samma modul) skulle R_Pointer och P_Pointer vara samma.
Flaggor
Byte(ar) | Storlek | Fält | Bits | Syfte |
---|---|---|---|---|
0 | 1 | Samma_R_ID | 0 | 1 Om R_Pointer-värdet för denna post är detsamma som föregående post i denna post; i så fall utelämnas R_Pointer-värdet från denna post. |
Samma_P_ID | 1 | 1 Om P_Pointer-värdet för denna post är detsamma som föregående post i denna post; i så fall utelämnas P_Pointer-värdet från denna post. | ||
Samma_Offset | 2 | 1 Om Offset-värdet för denna post är detsamma som föregående post i denna post; i så fall utelämnas Offset-värdet från denna post. | ||
3-4 | Reserverad | |||
5 | Reserverad | |||
Offset_length | 6 | 0 för att indikera längd på 4 byte | ||
Adresseringsläges känslighet | 7 | 0 Ingen känslighet | ||
1 Ställ in de höga bitarna i adressen till samma som R-lägesadresseringsläget för R_Pointer-adressen (gäller endast adresser av V-typ) | ||||
1 | 1 | R_Pointer_Indicators | 0-3 | Datatyp för andra operand för flyttadressen |
0 - R-adress | ||||
1 - Offset från början av R-adress | ||||
2 - R-Längd (0 för LD-objekt) | ||||
6 - Relativ omedelbar (för att tillåta instruktioner för att adressera externa symboler) | ||||
7 - R-konstant (ej delat dataområde) | ||||
9 - 20 -Bit lång förskjutningsadress | ||||
Alla andra värden är reserverade | ||||
4-7 | Typ av föremål som avser det värde som behöver flyttas. | |||
0 - Etikett, R-ID är begränsat till LD | ||||
1 - Element, R-ID är begränsat till ED | ||||
2 - Klass, R-ID är begränsat till ED; Klasser har inga externa namn så de har inget ESDID | ||||
3 - Del, R-ID är begränsat till PR. | ||||
Alla andra värden är reserverade | ||||
2 | 1 | Action_or_Operation | 0-6 | Typ av operation som ska användas med andra operanden (den första operanden skulle vara 0) resultatet är ett 32-bitars signerat värde som ersätter den första operanden |
0 - Lägg till andra operanden till första | ||||
1 - Subtrahera andra operanden från första | ||||
Alla andra värden är reserverade | ||||
Fixup Target Fetch/Store | 7 | Indikerar om målvärde ska användas eller ignoreras | ||
0 - Använd fixup/target-fält som första operand | ||||
1 - Ignorera värdet på målfält använd fixup-värde som första operand; om inget fixeringsvärde, använd 0 | ||||
3 | 1 | Reserverad | ||
4 | 1 | Mållängd | Osignerad längd på målfält i byte | |
5 | 1 | Reserverad |
LEN
LEN-poster används för att deklarera längden på en modul där den inte var känd när ESD-posten skapades, t.ex. för enpassskompilatorer.
Fält | Offset | Storlek | Beskrivning |
PTV | 0-2 | 3 | Record Type X'033000' |
3-5 | 3 | Reserverad | |
Längd | 6-7 | 2 | Längden på föremål som följer detta fält; värdet måste vara icke-noll |
Element | 8- | Elementlängdsdata; se elementtabellen nedan | |
REM | Efterföljande data till slutet av posten för poster med fast längd måste innehålla binära nollor; finns inte för poster med variabel längd. |
Element
En post med uppskjuten längd kan inte fortsätta eller delas
Fält | Offset | Storlek | Beskrivning |
ESDID | 0-3 | 4 | ESDID för element som detta värde gäller |
4-7 | 4 | Reserverad | |
Längd | 8-11 | 4 | Längden på det refererade objektet |
SLUTET
END måste vara den sista posten för en modul. En 'Entry Point' används när en annan adress än början av modulen ska användas som startpunkt för dess exekvering. Detta används antingen för att programmet har icke-körbara data som visas innan modulen startar (mycket vanligt för äldre assemblerprogrammerare, eftersom äldre versioner av assemblern var mycket långsammare att sätta ihop data lagrade i program när instruktionerna väl specificerades), eller eftersom modulen anropar en extern modul först, till exempel ett runtime-bibliotek för att initiera sig själv.
Fält | Offset | Storlek | Bits | Beskrivning |
PTV | 0-2 | 3 | X'034000' - Ej fortsättning | |
X'034100' - Fortsättning på nästa skiva | ||||
3 | 0-5 | 6 | Reserverad | |
Flaggor | 6-7 | 2 | Deklarationer om närvaro eller frånvaro av en ingångspunkt | |
00 - Ingen ingångspunkt given; alla andra värden i denna post är ogiltiga | ||||
01 - Ingångspunkt specificerad av ESDID | ||||
10 - Ingångspunkt specificerad med namn | ||||
11 - Reserverad | ||||
AMODE | 4 | 1 | Adresseringslägesvärde för ingångspunkt; värdena är de som anges i fält 0 i Beteendeattribut i ESD- posten. | |
5-7 | 3 | Reserverad | ||
Rekordräkning | 8-11 | 4 | Antal GOFF-poster i denna modul (detta är antalet "logiska" poster, dvs. fortsättningar räknas inte) | |
ESDID | 12-15 | 4 | Värdet på ESDID om ingångspunkten refereras av ESDID; binär noll om det refereras med namn | |
16-19 | 4 | Reserverad | ||
Offset | 20-23 | 4 | Adressförskjutning av modulens ingångspunkt; detta kan inte specificeras för en extern (ER) ingångspunkt | |
Namn Längd | 24-25 | 2 | Namnets längd, detta måste vara noll om ingångspunkten angavs av ESDID. | |
namn | 26- | Namnet på den externa symbolen som används som ingångspunkt för denna modul; är binära nollor om ingångspunkten specificerades av ESDID; om denna post fortsätter är detta de första 54 tecknen i namnet. Detta är det enda icke-binära värdet i posten; det skulle vara ett textfält som representerar det offentliga namnet för ingångspunkten | ||
REM | Trailer som sträcker sig till slutet av posten; bör vara binära nollor till slutet av posten för poster med fast längd; utelämnas för variabel längd |
Fortsättning
Om ett startpunktsnamn specificerat på en END-post med fast längd är längre än 54 byte eller (om denna post också fortsätts) är längre än ytterligare 77 byte, används följande fortsättningspost.
Fält | Offset | Storlek | Beskrivning |
PTV | 0-2 | 3 | X'034200' - Den här fortsättningsposten fortsätter inte |
X'034300' - Denna fortsättningspost fortsätter i sig på nästa post | |||
namn | 3- | Den återstående delen av ingångspunktsnamnet, om inte denna post fortsätter, i vilket fall det är de nästa 77 tecknen i namnet. | |
REM | Om denna post inte fortsätter, är detta den avslutande delen av posten för poster med fast längd och bör vara binära nollor; finns inte för poster med variabel längd |
- ^ John R. Ehrman (1 mars 2001). "Så fungerar länkredigeraren: en handledning om objekt-/laddningsmoduler, länkredigerare, laddare och vad de gör för (och för) dig" ( PDF) . IBM Silicon Valley (Santa Teresa) Laboratory, San Jose . Hämtad 8 september 2019 .
- ^ OS/MVS Programledning: Avancerade faciliteter (PDF) (åttonde upplagan). Poughkeepsie, NY: IBM. September 2007. SA22-7644-07 . Hämtad 9 augusti 2013 .
- ^ IBM High Level Assembler för MVS & VM & VSE Release 2 Presentation Guide (PDF) . December 1995. SG24-3910-01. Arkiverad från originalet (PDF) 2016-01-23 . Hämtad 13 november 2015 .
- ^ High Level Assembler för z/OS & z/VM & z/VSE Programmerares guide ( PDF) (sjätte upplagan). San Jose, Kalifornien: IBM. Juli 2008. Bilaga C. SC26-4941-05 . Hämtad 8 september 2019 .
- ^ "RLD" . www.ibm.com . IBM. 16 augusti 2013 . Hämtad 10 juli 2020 .