Mercurial > projects > dstep
view dstep/coreservices/carboncore/PEFBinaryFormat.d @ 16:19885b43130e
Huge update, the bridge actually works now
author | Jacob Carlborg <doob@me.com> |
---|---|
date | Sun, 03 Jan 2010 22:06:11 +0100 |
parents | 07194b026fa4 |
children |
line wrap: on
line source
/** * Copyright: Copyright (c) 2009 Jacob Carlborg. * Authors: Jacob Carlborg * Version: Initial created: Jul 21, 2009 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0) */ module dstep.coreservices.carboncore.PEFBinaryFormat; //import dstep.AvailabilityMacros; import dstep.coreservices.carboncore.MacTypes; import dstep.internal.Types; import dstep.objc.bridge.TypeEncoding; alias ushort PEFRelocChunk; alias PEFExportedSymbolHashSlot XLibExportedSymbolHashSlot; alias PEFExportedSymbolKey XLibExportedSymbolKey; struct PEFContainerHeader { uint tag1; uint tag2; uint architecture; uint formatVersion; uint dateTimeStamp; uint oldDefVersion; uint oldImpVersion; uint currentVersion; ushort sectionCount; ushort instSectionCount; uint reservedA; } // This is needed otherwise the enums will fail compiling with gdc version (GNU) { private { const __kPEFTag1 = getOSType!("Joy!"); const __kPEFTag2 = getOSType!("peff"); } } // This is needed otherwise the enums will fail compiling with gdc version (GNU) { private { const __kVLibTag2 = getOSType!("VLib"); const __kBLibTag2 = getOSType!("BLib"); } } enum { kPEFTag1 = getOSType!("Joy!"), kPEFTag2 = getOSType!("peff"), kPEFVersion = 0x00000001 } enum { kPEFFirstSectionHeaderOffset = PEFContainerHeader.sizeof } enum { kPEFCodeSection = 0, kPEFUnpackedDataSection = 1, kPEFPackedDataSection = 2, kPEFConstantSection = 3, kPEFExecDataSection = 6, kPEFLoaderSection = 4, kPEFDebugSection = 5, kPEFExceptionSection = 7, kPEFTracebackSection = 8 } enum { kPEFProcessShare = 1, kPEFGlobalShare = 4, kPEFProtectedShare = 5 } enum { kPEFPkDataZero = 0, kPEFPkDataBlock = 1, kPEFPkDataRepeat = 2, kPEFPkDataRepeatBlock = 3, kPEFPkDataRepeatZero = 4 } enum { kPEFPkDataOpcodeShift = 5, kPEFPkDataCount5Mask = 0x1F, kPEFPkDataMaxCount5 = 31, kPEFPkDataVCountShift = 7, kPEFPkDataVCountMask = 0x7F, kPEFPkDataVCountEndMask = 0x80 } enum { kPEFWeakImportLibMask = 0x40, kPEFInitLibBeforeMask = 0x80 } enum { kPEFImpSymClassShift = 24, kPEFImpSymNameOffsetMask = 0x00FFFFFF, kPEFImpSymMaxNameOffset = 0x00FFFFFF } enum { kPEFCodeSymbol = 0x00, kPEFDataSymbol = 0x01, kPEFTVectorSymbol = 0x02, kPEFTOCSymbol = 0x03, kPEFGlueSymbol = 0x04, kPEFUndefinedSymbol = 0x0F, kPEFWeakImportSymMask = 0x80 } enum { kPEFHashSlotSymCountShift = 18, kPEFHashSlotFirstKeyMask = 0x0003FFFF, kPEFHashSlotMaxSymbolCount = 0x00003FFF, kPEFHashSlotMaxKeyIndex = 0x0003FFFF } enum { kPEFHashLengthShift = 16, kPEFHashValueMask = 0x0000FFFF, kPEFHashMaxLength = 0x0000FFFF } enum { kPEFExpSymClassShift = 24, kPEFExpSymNameOffsetMask = 0x00FFFFFF, kPEFExpSymMaxNameOffset = 0x00FFFFFF } enum { kPEFAbsoluteExport = -2, kPEFReexportedImport = -3 } enum { kPEFRelocBasicOpcodeRange = 128 } enum { kPEFRelocBySectDWithSkip = 0x00, kPEFRelocBySectC = 0x20, kPEFRelocBySectD = 0x21, kPEFRelocTVector12 = 0x22, kPEFRelocTVector8 = 0x23, kPEFRelocVTable8 = 0x24, kPEFRelocImportRun = 0x25, kPEFRelocSmByImport = 0x30, kPEFRelocSmSetSectC = 0x31, kPEFRelocSmSetSectD = 0x32, kPEFRelocSmBySection = 0x33, kPEFRelocIncrPosition = 0x40, kPEFRelocSmRepeat = 0x48, kPEFRelocSetPosition = 0x50, kPEFRelocLgByImport = 0x52, kPEFRelocLgRepeat = 0x58, kPEFRelocLgSetOrBySection = 0x5A, kPEFRelocUndefinedOpcode = 0xFF } enum { kPEFRelocLgBySectionSubopcode = 0x00, kPEFRelocLgSetSectCSubopcode = 0x01, kPEFRelocLgSetSectDSubopcode = 0x02 } enum { kPEFRelocWithSkipMaxSkipCount = 255, kPEFRelocWithSkipMaxRelocCount = 63 } enum { kPEFRelocRunMaxRunLength = 512 } enum { kPEFRelocSmIndexMaxIndex = 511 } enum { kPEFRelocIncrPositionMaxOffset = 4096 } enum { kPEFRelocSmRepeatMaxChunkCount = 16, kPEFRelocSmRepeatMaxRepeatCount = 256 } enum { kPEFRelocSetPosMaxOffset = 0x03FFFFFF } enum { kPEFRelocLgByImportMaxIndex = 0x03FFFFFF } enum { kPEFRelocLgRepeatMaxChunkCount = 16, kPEFRelocLgRepeatMaxRepeatCount = 0x003FFFFF } enum { kPEFRelocLgSetOrBySectionMaxIndex = 0x003FFFFF } enum { kXLibTag1 = cast(c_long)0xF04D6163, kVLibTag2 = getOSType!("VLib"), kBLibTag2 = getOSType!("BLib"), kXLibVersion = 0x00000001 } struct PEFSectionHeader { int nameOffset; uint defaultAddress; uint totalLength; uint unpackedLength; uint containerLength; uint containerOffset; ubyte sectionKind; ubyte shareKind; ubyte alignment; ubyte reservedA; } struct PEFLoaderInfoHeader { int mainSection; uint mainOffset; int initSection; uint initOffset; int termSection; uint termOffset; uint importedLibraryCount; uint totalImportedSymbolCount; uint relocSectionCount; uint relocInstrOffset; uint loaderStringsOffset; uint exportHashOffset; uint exportHashTablePower; uint exportedSymbolCount; } struct PEFImportedLibrary { uint nameOffset; uint oldImpVersion; uint currentVersion; uint importedSymbolCount; uint firstImportedSymbol; ubyte options; ubyte reservedA; ushort reservedB; } struct PEFImportedSymbol { uint classAndName; } struct PEFExportedSymbolHashSlot { uint countAndStart; } struct PEFSplitHashWord { ushort nameLength; ushort hashValue; } struct PEFExportedSymbolKey { union { uint fullHashWord; PEFSplitHashWord splitHashWord; } } struct PEFExportedSymbol { uint classAndName; short symbolValue; SInt16 sectionIndex; } struct PEFLoaderRelocationHeader { ushort sectionIndex; uint reservedA; uint relocCount; UInt32 firstRelocOffset; } struct XLibContainerHeader { uint tag1; uint tag2; uint currentFormat; uint containerStringsOffset; uint exportHashOffset; uint exportKeyOffset; uint exportSymbolOffset; uint exportNamesOffset; uint exportHashTablePower; uint exportedSymbolCount; uint fragNameOffset; uint fragNameLength; uint dylibPathOffset; uint dylibPathLength; uint cpuFamily; uint cpuModel; uint dateTimeStamp; uint currentVersion; uint oldDefVersion; UInt32 oldImpVersion; } struct XLibExportedSymbol { uint classAndName; UInt32 bpOffset; }