| //===- MachOFormat.h - Mach-O Format Structures And Constants ---*- C++ -*-===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This file declares various structures and constants which are platform | |
| // independent and can be shared by any client which wishes to interact with | |
| // Mach object files. | |
| // | |
| // The definitions here are purposely chosen to match the LLVM style as opposed | |
| // to following the platform specific definition of the format. | |
| // | |
| // On a Mach system, see the <mach-o/...> includes for more information, in | |
| // particular <mach-o/loader.h>. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_OBJECT_MACHOFORMAT_H | |
| #define LLVM_OBJECT_MACHOFORMAT_H | |
| #include "llvm/Support/DataTypes.h" | |
| namespace llvm { | |
| namespace object { | |
| /// General Mach platform information. | |
| namespace mach { | |
| /// @name CPU Type and Subtype Information | |
| /// { | |
| /// \brief Capability bits used in CPU type encoding. | |
| enum CPUTypeFlagsMask { | |
| CTFM_ArchMask = 0xFF000000, | |
| CTFM_ArchABI64 = 0x01000000 | |
| }; | |
| /// \brief Machine type IDs used in CPU type encoding. | |
| enum CPUTypeMachine { | |
| CTM_i386 = 7, | |
| CTM_x86_64 = CTM_i386 | CTFM_ArchABI64, | |
| CTM_ARM = 12, | |
| CTM_SPARC = 14, | |
| CTM_PowerPC = 18, | |
| CTM_PowerPC64 = CTM_PowerPC | CTFM_ArchABI64 | |
| }; | |
| /// \brief Capability bits used in CPU subtype encoding. | |
| enum CPUSubtypeFlagsMask { | |
| CSFM_SubtypeMask = 0xFF000000, | |
| CSFM_SubtypeLib64 = 0x80000000 | |
| }; | |
| /// \brief ARM Machine Subtypes. | |
| enum CPUSubtypeARM { | |
| CSARM_ALL = 0, | |
| CSARM_V4T = 5, | |
| CSARM_V6 = 6, | |
| CSARM_V5TEJ = 7, | |
| CSARM_XSCALE = 8, | |
| CSARM_V7 = 9 | |
| }; | |
| /// \brief PowerPC Machine Subtypes. | |
| enum CPUSubtypePowerPC { | |
| CSPPC_ALL = 0 | |
| }; | |
| /// \brief SPARC Machine Subtypes. | |
| enum CPUSubtypeSPARC { | |
| CSSPARC_ALL = 0 | |
| }; | |
| /// \brief x86 Machine Subtypes. | |
| enum CPUSubtypeX86 { | |
| CSX86_ALL = 3 | |
| }; | |
| /// @} | |
| } // end namespace mach | |
| /// Format information for Mach object files. | |
| namespace macho { | |
| /// \brief Constants for structure sizes. | |
| enum StructureSizes { | |
| Header32Size = 28, | |
| Header64Size = 32, | |
| SegmentLoadCommand32Size = 56, | |
| SegmentLoadCommand64Size = 72, | |
| Section32Size = 68, | |
| Section64Size = 80, | |
| SymtabLoadCommandSize = 24, | |
| DysymtabLoadCommandSize = 80, | |
| Nlist32Size = 12, | |
| Nlist64Size = 16, | |
| RelocationInfoSize = 8 | |
| }; | |
| /// \brief Constants for header magic field. | |
| enum HeaderMagic { | |
| HM_Object32 = 0xFEEDFACE, ///< 32-bit mach object file | |
| HM_Object64 = 0xFEEDFACF, ///< 64-bit mach object file | |
| HM_Universal = 0xCAFEBABE ///< Universal object file | |
| }; | |
| /// \brief Header common to all Mach object files. | |
| struct Header { | |
| uint32_t Magic; | |
| uint32_t CPUType; | |
| uint32_t CPUSubtype; | |
| uint32_t FileType; | |
| uint32_t NumLoadCommands; | |
| uint32_t SizeOfLoadCommands; | |
| uint32_t Flags; | |
| }; | |
| /// \brief Extended header for 64-bit object files. | |
| struct Header64Ext { | |
| uint32_t Reserved; | |
| }; | |
| // See <mach-o/loader.h>. | |
| enum HeaderFileType { | |
| HFT_Object = 0x1 | |
| }; | |
| enum HeaderFlags { | |
| HF_SubsectionsViaSymbols = 0x2000 | |
| }; | |
| enum LoadCommandType { | |
| LCT_Segment = 0x1, | |
| LCT_Symtab = 0x2, | |
| LCT_Dysymtab = 0xb, | |
| LCT_Segment64 = 0x19, | |
| LCT_UUID = 0x1b, | |
| LCT_CodeSignature = 0x1d, | |
| LCT_SegmentSplitInfo = 0x1e, | |
| LCT_FunctionStarts = 0x26 | |
| }; | |
| /// \brief Load command structure. | |
| struct LoadCommand { | |
| uint32_t Type; | |
| uint32_t Size; | |
| }; | |
| /// @name Load Command Structures | |
| /// @{ | |
| struct SegmentLoadCommand { | |
| uint32_t Type; | |
| uint32_t Size; | |
| char Name[16]; | |
| uint32_t VMAddress; | |
| uint32_t VMSize; | |
| uint32_t FileOffset; | |
| uint32_t FileSize; | |
| uint32_t MaxVMProtection; | |
| uint32_t InitialVMProtection; | |
| uint32_t NumSections; | |
| uint32_t Flags; | |
| }; | |
| struct Segment64LoadCommand { | |
| uint32_t Type; | |
| uint32_t Size; | |
| char Name[16]; | |
| uint64_t VMAddress; | |
| uint64_t VMSize; | |
| uint64_t FileOffset; | |
| uint64_t FileSize; | |
| uint32_t MaxVMProtection; | |
| uint32_t InitialVMProtection; | |
| uint32_t NumSections; | |
| uint32_t Flags; | |
| }; | |
| struct SymtabLoadCommand { | |
| uint32_t Type; | |
| uint32_t Size; | |
| uint32_t SymbolTableOffset; | |
| uint32_t NumSymbolTableEntries; | |
| uint32_t StringTableOffset; | |
| uint32_t StringTableSize; | |
| }; | |
| struct DysymtabLoadCommand { | |
| uint32_t Type; | |
| uint32_t Size; | |
| uint32_t LocalSymbolsIndex; | |
| uint32_t NumLocalSymbols; | |
| uint32_t ExternalSymbolsIndex; | |
| uint32_t NumExternalSymbols; | |
| uint32_t UndefinedSymbolsIndex; | |
| uint32_t NumUndefinedSymbols; | |
| uint32_t TOCOffset; | |
| uint32_t NumTOCEntries; | |
| uint32_t ModuleTableOffset; | |
| uint32_t NumModuleTableEntries; | |
| uint32_t ReferenceSymbolTableOffset; | |
| uint32_t NumReferencedSymbolTableEntries; | |
| uint32_t IndirectSymbolTableOffset; | |
| uint32_t NumIndirectSymbolTableEntries; | |
| uint32_t ExternalRelocationTableOffset; | |
| uint32_t NumExternalRelocationTableEntries; | |
| uint32_t LocalRelocationTableOffset; | |
| uint32_t NumLocalRelocationTableEntries; | |
| }; | |
| struct LinkeditDataLoadCommand { | |
| uint32_t Type; | |
| uint32_t Size; | |
| uint32_t DataOffset; | |
| uint32_t DataSize; | |
| }; | |
| /// @} | |
| /// @name Section Data | |
| /// @{ | |
| struct Section { | |
| char Name[16]; | |
| char SegmentName[16]; | |
| uint32_t Address; | |
| uint32_t Size; | |
| uint32_t Offset; | |
| uint32_t Align; | |
| uint32_t RelocationTableOffset; | |
| uint32_t NumRelocationTableEntries; | |
| uint32_t Flags; | |
| uint32_t Reserved1; | |
| uint32_t Reserved2; | |
| }; | |
| struct Section64 { | |
| char Name[16]; | |
| char SegmentName[16]; | |
| uint64_t Address; | |
| uint64_t Size; | |
| uint32_t Offset; | |
| uint32_t Align; | |
| uint32_t RelocationTableOffset; | |
| uint32_t NumRelocationTableEntries; | |
| uint32_t Flags; | |
| uint32_t Reserved1; | |
| uint32_t Reserved2; | |
| uint32_t Reserved3; | |
| }; | |
| /// @} | |
| /// @name Symbol Table Entries | |
| /// @{ | |
| struct SymbolTableEntry { | |
| uint32_t StringIndex; | |
| uint8_t Type; | |
| uint8_t SectionIndex; | |
| uint16_t Flags; | |
| uint32_t Value; | |
| }; | |
| struct Symbol64TableEntry { | |
| uint32_t StringIndex; | |
| uint8_t Type; | |
| uint8_t SectionIndex; | |
| uint16_t Flags; | |
| uint64_t Value; | |
| }; | |
| /// @} | |
| /// @name Indirect Symbol Table | |
| /// @{ | |
| struct IndirectSymbolTableEntry { | |
| uint32_t Index; | |
| }; | |
| /// @} | |
| /// @name Relocation Data | |
| /// @{ | |
| struct RelocationEntry { | |
| uint32_t Word0; | |
| uint32_t Word1; | |
| }; | |
| /// @} | |
| // See <mach-o/nlist.h>. | |
| enum SymbolTypeType { | |
| STT_Undefined = 0x00, | |
| STT_Absolute = 0x02, | |
| STT_Section = 0x0e | |
| }; | |
| enum SymbolTypeFlags { | |
| // If any of these bits are set, then the entry is a stab entry number (see | |
| // <mach-o/stab.h>. Otherwise the other masks apply. | |
| STF_StabsEntryMask = 0xe0, | |
| STF_TypeMask = 0x0e, | |
| STF_External = 0x01, | |
| STF_PrivateExtern = 0x10 | |
| }; | |
| /// IndirectSymbolFlags - Flags for encoding special values in the indirect | |
| /// symbol entry. | |
| enum IndirectSymbolFlags { | |
| ISF_Local = 0x80000000, | |
| ISF_Absolute = 0x40000000 | |
| }; | |
| /// RelocationFlags - Special flags for addresses. | |
| enum RelocationFlags { | |
| RF_Scattered = 0x80000000 | |
| }; | |
| /// Common relocation info types. | |
| enum RelocationInfoType { | |
| RIT_Vanilla = 0, | |
| RIT_Pair = 1, | |
| RIT_Difference = 2 | |
| }; | |
| /// Generic relocation info types, which are shared by some (but not all) | |
| /// platforms. | |
| enum RelocationInfoType_Generic { | |
| RIT_Generic_PreboundLazyPointer = 3, | |
| RIT_Generic_LocalDifference = 4, | |
| RIT_Generic_TLV = 5 | |
| }; | |
| /// X86_64 uses its own relocation types. | |
| enum RelocationInfoTypeX86_64 { | |
| // Note that x86_64 doesn't even share the common relocation types. | |
| RIT_X86_64_Unsigned = 0, | |
| RIT_X86_64_Signed = 1, | |
| RIT_X86_64_Branch = 2, | |
| RIT_X86_64_GOTLoad = 3, | |
| RIT_X86_64_GOT = 4, | |
| RIT_X86_64_Subtractor = 5, | |
| RIT_X86_64_Signed1 = 6, | |
| RIT_X86_64_Signed2 = 7, | |
| RIT_X86_64_Signed4 = 8, | |
| RIT_X86_64_TLV = 9 | |
| }; | |
| /// ARM uses its own relocation types. | |
| enum RelocationInfoTypeARM { | |
| RIT_ARM_LocalDifference = 3, | |
| RIT_ARM_PreboundLazyPointer = 4, | |
| RIT_ARM_Branch24Bit = 5, | |
| RIT_ARM_ThumbBranch22Bit = 6, | |
| RIT_ARM_ThumbBranch32Bit = 7, | |
| RIT_ARM_Half = 8, | |
| RIT_ARM_HalfDifference = 9 | |
| }; | |
| } // end namespace macho | |
| } // end namespace object | |
| } // end namespace llvm | |
| #endif |