20 #ifndef __PEFBINARYFORMAT__
21 #define __PEFBINARYFORMAT__
39 #if PRAGMA_STRUCT_ALIGN
40 #pragma options align = mac68k
41 #elif PRAGMA_STRUCT_PACKPUSH
43 #elif PRAGMA_STRUCT_PACK
131 UInt32 formatVersion;
132 UInt32 dateTimeStamp;
135 UInt32 oldImpVersion;
137 UInt32 currentVersion;
139 UInt16 instSectionCount;
144 kPEFTag1 = FOUR_CHAR_CODE(
'Joy!'),
145 kPEFTag2 = FOUR_CHAR_CODE(
'peff'),
146 kPEFVersion = 0x00000001
151 #define PEFFirstSectionNameOffset(container) \
152 (kPEFFirstSectionHeaderOffset + \
153 ((container)->sectionCount * sizeof(PEFSectionHeader)))
163 UInt32 defaultAddress;
165 UInt32 unpackedLength;
167 UInt32 containerLength;
168 UInt32 containerOffset;
179 kPEFUnpackedDataSection = 1,
180 kPEFPackedDataSection = 2,
181 kPEFConstantSection = 3,
182 kPEFExecDataSection = 6,
184 kPEFLoaderSection = 4,
185 kPEFDebugSection = 5,
186 kPEFExceptionSection = 7,
187 kPEFTracebackSection = 8
192 kPEFProcessShare = 1,
194 kPEFProtectedShare = 5
229 kPEFPkDataRepeat = 2,
230 kPEFPkDataRepeatBlock = 3,
231 kPEFPkDataRepeatZero = 4
235 kPEFPkDataOpcodeShift = 5,
236 kPEFPkDataCount5Mask = 0x1F,
237 kPEFPkDataMaxCount5 = 31,
238 kPEFPkDataVCountShift = 7,
239 kPEFPkDataVCountMask = 0x7F,
240 kPEFPkDataVCountEndMask = 0x80
243 #define PEFPkDataOpcode(byte) (((UInt8)(byte)) >> kPEFPkDataOpcodeShift)
245 #define PEFPkDataCount5(byte) (((UInt8)(byte)) & kPEFPkDataCount5Mask)
247 #define PEFPkDataComposeInstr(opcode, count5) \
248 ((((UInt8)(opcode)) << kPEFPkDataOpcodeShift) | ((UInt8)(count5)))
353 UInt32 importedLibraryCount;
354 UInt32 totalImportedSymbolCount;
355 UInt32 relocSectionCount;
356 UInt32 relocInstrOffset;
357 UInt32 loaderStringsOffset;
358 UInt32 exportHashOffset;
359 UInt32 exportHashTablePower;
360 UInt32 exportedSymbolCount;
371 UInt32 oldImpVersion;
372 UInt32 currentVersion;
373 UInt32 importedSymbolCount;
374 UInt32 firstImportedSymbol;
383 kPEFWeakImportLibMask =
385 kPEFInitLibBeforeMask =
410 kPEFImpSymClassShift = 24,
411 kPEFImpSymNameOffsetMask = 0x00FFFFFF,
412 kPEFImpSymMaxNameOffset = 0x00FFFFFF
415 #define PEFImportedSymbolClass(classAndName) \
416 ((UInt8)((classAndName) >> kPEFImpSymClassShift))
417 #define PEFImportedSymbolNameOffset(classAndName) \
418 ((classAndName) & kPEFImpSymNameOffsetMask)
420 #define PEFComposeImportedSymbol(class, nameOffset) \
421 ((((UInt32)(class)) << kPEFImpSymClassShift) | ((UInt32)(nameOffset)))
425 kPEFCodeSymbol = 0x00,
426 kPEFDataSymbol = 0x01,
427 kPEFTVectorSymbol = 0x02,
428 kPEFTOCSymbol = 0x03,
429 kPEFGlueSymbol = 0x04,
430 kPEFUndefinedSymbol = 0x0F,
431 kPEFWeakImportSymMask = 0x80
513 UInt32 countAndStart;
517 kPEFHashSlotSymCountShift = 18,
518 kPEFHashSlotFirstKeyMask = 0x0003FFFF,
519 kPEFHashSlotMaxSymbolCount = 0x00003FFF,
520 kPEFHashSlotMaxKeyIndex = 0x0003FFFF
523 #define PEFHashTableIndex(fullHashWord, hashTablePower) \
524 (((fullHashWord) ^ ((fullHashWord) >> (hashTablePower))) & \
525 ((1 << (hashTablePower)) - 1))
527 #define PEFHashSlotSymbolCount(countAndStart) \
528 ((UInt32)((countAndStart) >> kPEFHashSlotSymCountShift))
529 #define PEFHashSlotFirstKey(countAndStart) \
530 ((countAndStart) & kPEFHashSlotFirstKeyMask)
532 #define PEFComposeExportedSymbolHashSlot(symbolCount, firstKey) \
533 ((((UInt32)(symbolCount)) << kPEFHashSlotSymCountShift) | \
534 ((UInt32)(firstKey)))
554 kPEFHashLengthShift = 16,
555 kPEFHashValueMask = 0x0000FFFF,
556 kPEFHashMaxLength = 0x0000FFFF
559 #define PEFHashNameLength(fullHashWord) \
560 ((UInt32)((fullHashWord) >> kPEFHashLengthShift))
561 #define PEFHashValue(fullHashWord) ((fullHashWord) & kPEFHashValueMask)
563 #define PEFComposeFullHashWord(nameLength, hashValue) \
564 ((((UInt32)(nameLength)) << kPEFHashLengthShift) | ((UInt32)(hashValue)))
627 kPEFExpSymClassShift = 24,
628 kPEFExpSymNameOffsetMask = 0x00FFFFFF,
629 kPEFExpSymMaxNameOffset = 0x00FFFFFF
632 #define PEFExportedSymbolClass(classAndName) \
633 ((UInt8)((classAndName) >> kPEFExpSymClassShift))
634 #define PEFExportedSymbolNameOffset(classAndName) \
635 ((classAndName) & kPEFExpSymNameOffsetMask)
637 #define PEFComposeExportedSymbol(class, nameOffset) \
638 ((((UInt32)(class)) << kPEFExpSymClassShift) | ((UInt32)(nameOffset)))
642 kPEFAbsoluteExport = -2,
643 kPEFReexportedImport =
669 typedef UInt16 PEFRelocChunk;
674 UInt32 firstRelocOffset;
693 #define PEFRFShift(offset, length) (16 - ((offset) + (length)))
694 #define PEFRFMask(length) ((1 << (length)) - 1)
696 #define PEFRelocField(chunk, offset, length) \
697 (((chunk) >> (16 - ((offset) + (length)))) & ((1 << (length)) - 1))
719 enum { kPEFRelocBasicOpcodeRange = 128 };
721 #define PEFRelocBasicOpcode(firstChunk) \
722 (kPEFRelocBasicOpcodes[(firstChunk) >> 9])
734 kPEFRelocBySectDWithSkip = 0x00,
735 kPEFRelocBySectC = 0x20,
736 kPEFRelocBySectD = 0x21,
737 kPEFRelocTVector12 = 0x22,
738 kPEFRelocTVector8 = 0x23,
739 kPEFRelocVTable8 = 0x24,
740 kPEFRelocImportRun = 0x25,
741 kPEFRelocSmByImport = 0x30,
742 kPEFRelocSmSetSectC = 0x31,
743 kPEFRelocSmSetSectD = 0x32,
744 kPEFRelocSmBySection = 0x33,
745 kPEFRelocIncrPosition = 0x40,
746 kPEFRelocSmRepeat = 0x48,
747 kPEFRelocSetPosition = 0x50,
748 kPEFRelocLgByImport = 0x52,
749 kPEFRelocLgRepeat = 0x58,
750 kPEFRelocLgSetOrBySection = 0x5A,
751 kPEFRelocUndefinedOpcode =
766 kPEFRelocLgBySectionSubopcode = 0x00,
767 kPEFRelocLgSetSectCSubopcode = 0x01,
768 kPEFRelocLgSetSectDSubopcode = 0x02
771 #define PEFRelocLgSetOrBySubopcode(chunk) (((chunk) >> 6) & 0x0F)
782 #define PEFMaskedBasicOpcodes \
784 kPEFRelocBySectDWithSkip, kPEFRelocBySectDWithSkip, \
785 kPEFRelocBySectDWithSkip, kPEFRelocBySectDWithSkip, \
786 kPEFRelocBySectDWithSkip, kPEFRelocBySectDWithSkip, \
787 kPEFRelocBySectDWithSkip, kPEFRelocBySectDWithSkip, \
788 kPEFRelocBySectDWithSkip, kPEFRelocBySectDWithSkip, \
789 kPEFRelocBySectDWithSkip, kPEFRelocBySectDWithSkip, \
790 kPEFRelocBySectDWithSkip, kPEFRelocBySectDWithSkip, \
791 kPEFRelocBySectDWithSkip, kPEFRelocBySectDWithSkip, \
793 kPEFRelocBySectDWithSkip, kPEFRelocBySectDWithSkip, \
794 kPEFRelocBySectDWithSkip, kPEFRelocBySectDWithSkip, \
795 kPEFRelocBySectDWithSkip, kPEFRelocBySectDWithSkip, \
796 kPEFRelocBySectDWithSkip, kPEFRelocBySectDWithSkip, \
797 kPEFRelocBySectDWithSkip, kPEFRelocBySectDWithSkip, \
798 kPEFRelocBySectDWithSkip, kPEFRelocBySectDWithSkip, \
799 kPEFRelocBySectDWithSkip, kPEFRelocBySectDWithSkip, \
800 kPEFRelocBySectDWithSkip, kPEFRelocBySectDWithSkip, \
802 kPEFRelocBySectC, kPEFRelocBySectD, kPEFRelocTVector12, \
804 kPEFRelocVTable8, kPEFRelocImportRun, kPEFRelocUndefinedOpcode, \
805 kPEFRelocUndefinedOpcode, \
807 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
808 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
809 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
810 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
812 kPEFRelocSmByImport, kPEFRelocSmSetSectC, kPEFRelocSmSetSectD, \
813 kPEFRelocSmBySection, \
815 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
816 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
817 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
818 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
819 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
820 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
822 kPEFRelocIncrPosition, kPEFRelocIncrPosition, kPEFRelocIncrPosition, \
823 kPEFRelocIncrPosition, \
824 kPEFRelocIncrPosition, kPEFRelocIncrPosition, kPEFRelocIncrPosition, \
825 kPEFRelocIncrPosition, \
827 kPEFRelocSmRepeat, kPEFRelocSmRepeat, kPEFRelocSmRepeat, \
829 kPEFRelocSmRepeat, kPEFRelocSmRepeat, kPEFRelocSmRepeat, \
832 kPEFRelocSetPosition, kPEFRelocSetPosition, kPEFRelocLgByImport, \
833 kPEFRelocLgByImport, \
835 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
836 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
838 kPEFRelocLgRepeat, kPEFRelocLgRepeat, kPEFRelocLgSetOrBySection, \
839 kPEFRelocLgSetOrBySection, \
841 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
842 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
844 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
845 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
846 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
847 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
848 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
849 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
850 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
851 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
853 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
854 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
855 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
856 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
857 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
858 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
859 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode, \
860 kPEFRelocUndefinedOpcode, kPEFRelocUndefinedOpcode
882 kPEFRelocWithSkipMaxSkipCount = 255,
883 kPEFRelocWithSkipMaxRelocCount = 63
886 #define PEFRelocWithSkipSkipCount(chunk) PEFRelocField((chunk), 2, 8)
887 #define PEFRelocWithSkipRelocCount(chunk) PEFRelocField((chunk), 10, 6)
889 #define PEFRelocComposeWithSkip(skipCount, relocCount) \
890 (0x0000 | (((UInt16)(skipCount)) << 6) | ((UInt16)(relocCount)))
917 enum { kPEFRelocRunMaxRunLength = 512 };
919 #define PEFRelocRunSubopcode(chunk) PEFRelocField((chunk), 3, 4)
920 #define PEFRelocRunRunLength(chunk) (PEFRelocField((chunk), 7, 9) + 1)
922 #define PEFRelocComposeRun(subopcode, runLength) \
923 (0x4000 | (((UInt16)(subopcode)) << 9) | ((UInt16)((runLength)-1)))
925 #define PEFRelocComposeBySectC(runLength) PEFRelocComposeRun(0, (runLength))
926 #define PEFRelocComposeBySectD(runLength) PEFRelocComposeRun(1, (runLength))
927 #define PEFRelocComposeTVector12(runLength) PEFRelocComposeRun(2, (runLength))
928 #define PEFRelocComposeTVector8(runLength) PEFRelocComposeRun(3, (runLength))
929 #define PEFRelocComposeVTable8(runLength) PEFRelocComposeRun(4, (runLength))
930 #define PEFRelocComposeImportRun(runLength) PEFRelocComposeRun(5, (runLength))
954 enum { kPEFRelocSmIndexMaxIndex = 511 };
956 #define PEFRelocSmIndexSubopcode(chunk) PEFRelocField((chunk), 3, 4)
957 #define PEFRelocSmIndexIndex(chunk) PEFRelocField((chunk), 7, 9)
959 #define PEFRelocComposeSmIndex(subopcode, index) \
960 (0x6000 | (((UInt16)(subopcode)) << 9) | ((UInt16)(index)))
962 #define PEFRelocComposeSmByImport(index) PEFRelocComposeSmIndex(0, (index))
963 #define PEFRelocComposeSmSetSectC(index) PEFRelocComposeSmIndex(1, (index))
964 #define PEFRelocComposeSmSetSectD(index) PEFRelocComposeSmIndex(2, (index))
965 #define PEFRelocComposeSmBySection(index) PEFRelocComposeSmIndex(3, (index))
988 enum { kPEFRelocIncrPositionMaxOffset = 4096 };
990 #define PEFRelocIncrPositionOffset(chunk) (PEFRelocField((chunk), 4, 12) + 1)
992 #define PEFRelocComposeIncrPosition(offset) (0x8000 | ((UInt16)((offset)-1)))
1015 kPEFRelocSmRepeatMaxChunkCount = 16,
1016 kPEFRelocSmRepeatMaxRepeatCount = 256
1019 #define PEFRelocSmRepeatChunkCount(chunk) (PEFRelocField((chunk), 4, 4) + 1)
1020 #define PEFRelocSmRepeatRepeatCount(chunk) (PEFRelocField((chunk), 8, 8) + 1)
1022 #define PEFRelocComposeSmRepeat(chunkCount, repeatCount) \
1023 (0x9000 | ((((UInt16)(chunkCount)) - 1) << 8) | (((UInt16)(repeatCount)) - 1))
1045 kPEFRelocSetPosMaxOffset = 0x03FFFFFF
1048 #define PEFRelocSetPosOffsetHigh(chunk) PEFRelocField((chunk), 6, 10)
1050 #define PEFRelocSetPosFullOffset(firstChunk, secondChunk) \
1051 (((((UInt32)(firstChunk)) & 0x03FF) << 16) | ((UInt32)(secondChunk)))
1053 #define PEFRelocComposeSetPosition_1st(fullOffset) \
1054 (0xA000 | ((UInt16)(((UInt32)(fullOffset)) >> 16)))
1055 #define PEFRelocComposeSetPosition_2nd(fullOffset) \
1056 ((UInt16)((UInt32)(fullOffset) & 0xFFFF))
1078 kPEFRelocLgByImportMaxIndex = 0x03FFFFFF
1081 #define PEFRelocLgByImportIndexHigh(chunk) PEFRelocField((chunk), 6, 10)
1083 #define PEFRelocLgByImportFullIndex(firstChunk, secondChunk) \
1084 (((((UInt32)(firstChunk)) & 0x03FF) << 16) | ((UInt32)(secondChunk)))
1086 #define PEFRelocComposeLgByImport_1st(fullIndex) \
1087 (0xA400 | ((UInt16)(((UInt32)(fullIndex)) >> 16)))
1088 #define PEFRelocComposeLgByImport_2nd(fullIndex) \
1089 ((UInt16)((UInt32)(fullIndex) & 0xFFFF))
1112 kPEFRelocLgRepeatMaxChunkCount = 16,
1113 kPEFRelocLgRepeatMaxRepeatCount = 0x003FFFFF
1116 #define PEFRelocLgRepeatChunkCount(chunk) (PEFRelocField((chunk), 6, 4) + 1)
1117 #define PEFRelocLgRepeatRepeatCountHigh(chunk) PEFRelocField((chunk), 10, 6)
1119 #define PEFRelocLgRepeatFullRepeatCount(firstChunk, secondChunk) \
1120 (((((UInt32)(firstChunk)) & 0x003F) << 16) | ((UInt32)(secondChunk)))
1122 #define PEFRelocComposeLgRepeat_1st(chunkCount, fullRepeatCount) \
1123 (0xB000 | ((((UInt16)(chunkCount)) - 1) << 6) | \
1124 ((UInt16)(((UInt32)(fullRepeatCount)) >> 16)))
1125 #define PEFRelocComposeLgRepeat_2nd(chunkCount, fullRepeatCount) \
1126 ((UInt16)((UInt32)(fullRepeatCount) & 0xFFFF))
1151 kPEFRelocLgSetOrBySectionMaxIndex = 0x003FFFFF
1154 #define PEFRelocLgSetOrBySectionSubopcode(chunk) PEFRelocField((chunk), 6, 4)
1155 #define PEFRelocLgSetOrBySectionIndexHigh(chunk) PEFRelocField((chunk), 10, 6)
1157 #define PEFRelocLgSetOrBySectionFullIndex(firstChunk, secondChunk) \
1158 (((((UInt32)(firstChunk)) & 0x003F) << 16) | ((UInt32)(secondChunk)))
1160 #define PEFRelocComposeLgSetOrBySection_1st(subopcode, fullIndex) \
1161 (0xB400 | (((UInt16)(subopcode)) << 6) | \
1162 ((UInt16)(((UInt32)(fullIndex)) >> 16)))
1163 #define PEFRelocComposeLgSetOrBySection_2nd(subopcode, fullIndex) \
1164 ((UInt16)((UInt32)(fullIndex) & 0xFFFF))
1166 #define PEFRelocComposeLgBySection(fullIndex) \
1167 PEFRelocComposeLgSetOrBySection(0x00, (fullIndex))
1168 #define PEFRelocComposeLgSetSectC(fullIndex) \
1169 PEFRelocComposeLgSetOrBySection(0x01, (fullIndex))
1170 #define PEFRelocComposeLgSetSectD(fullIndex) \
1171 PEFRelocComposeLgSetOrBySection(0x02, (fullIndex))
1173 #if PRAGMA_STRUCT_ALIGN
1174 #pragma options align = reset
1175 #elif PRAGMA_STRUCT_PACKPUSH
1177 #elif PRAGMA_STRUCT_PACK
1181 #ifdef PRAGMA_IMPORT_OFF
1184 #pragma import reset
Basic Macintosh data types.
Definition: PEFBinaryFormat.h:512
Definition: PEFBinaryFormat.h:546
Definition: PEFBinaryFormat.h:605
Definition: PEFBinaryFormat.h:369
Definition: PEFBinaryFormat.h:405
Definition: PEFBinaryFormat.h:541