Home | History | Annotate | Download | only in Object
      1 //===- MachOFormat.h - Mach-O Format Structures And Constants ---*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file declares various structures and constants which are platform
     11 // independent and can be shared by any client which wishes to interact with
     12 // Mach object files.
     13 //
     14 // The definitions here are purposely chosen to match the LLVM style as opposed
     15 // to following the platform specific definition of the format.
     16 //
     17 // On a Mach system, see the <mach-o/...> includes for more information, in
     18 // particular <mach-o/loader.h>.
     19 //
     20 //===----------------------------------------------------------------------===//
     21 
     22 #ifndef LLVM_OBJECT_MACHOFORMAT_H
     23 #define LLVM_OBJECT_MACHOFORMAT_H
     24 
     25 #include "llvm/Support/DataTypes.h"
     26 
     27 namespace llvm {
     28 namespace object {
     29 
     30 /// General Mach platform information.
     31 namespace mach {
     32   /// @name CPU Type and Subtype Information
     33   /// {
     34 
     35   /// \brief Capability bits used in CPU type encoding.
     36   enum CPUTypeFlagsMask {
     37     CTFM_ArchMask =  0xFF000000,
     38     CTFM_ArchABI64 = 0x01000000
     39   };
     40 
     41   /// \brief Machine type IDs used in CPU type encoding.
     42   enum CPUTypeMachine {
     43     CTM_i386      = 7,
     44     CTM_x86_64    = CTM_i386 | CTFM_ArchABI64,
     45     CTM_ARM       = 12,
     46     CTM_SPARC     = 14,
     47     CTM_PowerPC   = 18,
     48     CTM_PowerPC64 = CTM_PowerPC | CTFM_ArchABI64
     49   };
     50 
     51   /// \brief Capability bits used in CPU subtype encoding.
     52   enum CPUSubtypeFlagsMask {
     53     CSFM_SubtypeMask =  0xFF000000,
     54     CSFM_SubtypeLib64 = 0x80000000
     55   };
     56 
     57   /// \brief ARM Machine Subtypes.
     58   enum CPUSubtypeARM {
     59     CSARM_ALL    = 0,
     60     CSARM_V4T    = 5,
     61     CSARM_V6     = 6,
     62     CSARM_V5TEJ  = 7,
     63     CSARM_XSCALE = 8,
     64     CSARM_V7     = 9
     65   };
     66 
     67   /// \brief PowerPC Machine Subtypes.
     68   enum CPUSubtypePowerPC {
     69     CSPPC_ALL = 0
     70   };
     71 
     72   /// \brief SPARC Machine Subtypes.
     73   enum CPUSubtypeSPARC {
     74     CSSPARC_ALL = 0
     75   };
     76 
     77   /// \brief x86 Machine Subtypes.
     78   enum CPUSubtypeX86 {
     79     CSX86_ALL = 3
     80   };
     81 
     82   /// @}
     83 
     84 } // end namespace mach
     85 
     86 /// Format information for Mach object files.
     87 namespace macho {
     88   /// \brief Constants for structure sizes.
     89   enum StructureSizes {
     90     Header32Size = 28,
     91     Header64Size = 32,
     92     SegmentLoadCommand32Size = 56,
     93     SegmentLoadCommand64Size = 72,
     94     Section32Size = 68,
     95     Section64Size = 80,
     96     SymtabLoadCommandSize = 24,
     97     DysymtabLoadCommandSize = 80,
     98     Nlist32Size = 12,
     99     Nlist64Size = 16,
    100     RelocationInfoSize = 8,
    101     LinkeditLoadCommandSize = 16
    102   };
    103 
    104   /// \brief Constants for header magic field.
    105   enum HeaderMagic {
    106     HM_Object32 = 0xFEEDFACE,  ///< 32-bit mach object file
    107     HM_Object64 = 0xFEEDFACF,  ///< 64-bit mach object file
    108     HM_Universal = 0xCAFEBABE  ///< Universal object file
    109   };
    110 
    111   /// \brief Header common to all Mach object files.
    112   struct Header {
    113     uint32_t Magic;
    114     uint32_t CPUType;
    115     uint32_t CPUSubtype;
    116     uint32_t FileType;
    117     uint32_t NumLoadCommands;
    118     uint32_t SizeOfLoadCommands;
    119     uint32_t Flags;
    120   };
    121 
    122   /// \brief Extended header for 64-bit object files.
    123   struct Header64Ext {
    124     uint32_t Reserved;
    125   };
    126 
    127   // See <mach-o/loader.h>.
    128   enum HeaderFileType {
    129     HFT_Object = 0x1
    130   };
    131 
    132   enum HeaderFlags {
    133     HF_SubsectionsViaSymbols = 0x2000
    134   };
    135 
    136   enum LoadCommandType {
    137     LCT_Segment = 0x1,
    138     LCT_Symtab = 0x2,
    139     LCT_Dysymtab = 0xb,
    140     LCT_Segment64 = 0x19,
    141     LCT_UUID = 0x1b,
    142     LCT_CodeSignature = 0x1d,
    143     LCT_SegmentSplitInfo = 0x1e,
    144     LCT_FunctionStarts = 0x26,
    145     LCT_DataInCode = 0x29
    146   };
    147 
    148   /// \brief Load command structure.
    149   struct LoadCommand {
    150     uint32_t Type;
    151     uint32_t Size;
    152   };
    153 
    154   /// @name Load Command Structures
    155   /// @{
    156 
    157   struct SegmentLoadCommand {
    158     uint32_t Type;
    159     uint32_t Size;
    160     char Name[16];
    161     uint32_t VMAddress;
    162     uint32_t VMSize;
    163     uint32_t FileOffset;
    164     uint32_t FileSize;
    165     uint32_t MaxVMProtection;
    166     uint32_t InitialVMProtection;
    167     uint32_t NumSections;
    168     uint32_t Flags;
    169   };
    170 
    171   struct Segment64LoadCommand {
    172     uint32_t Type;
    173     uint32_t Size;
    174     char Name[16];
    175     uint64_t VMAddress;
    176     uint64_t VMSize;
    177     uint64_t FileOffset;
    178     uint64_t FileSize;
    179     uint32_t MaxVMProtection;
    180     uint32_t InitialVMProtection;
    181     uint32_t NumSections;
    182     uint32_t Flags;
    183   };
    184 
    185   struct SymtabLoadCommand {
    186     uint32_t Type;
    187     uint32_t Size;
    188     uint32_t SymbolTableOffset;
    189     uint32_t NumSymbolTableEntries;
    190     uint32_t StringTableOffset;
    191     uint32_t StringTableSize;
    192   };
    193 
    194   struct DysymtabLoadCommand {
    195     uint32_t Type;
    196     uint32_t Size;
    197 
    198     uint32_t LocalSymbolsIndex;
    199     uint32_t NumLocalSymbols;
    200 
    201     uint32_t ExternalSymbolsIndex;
    202     uint32_t NumExternalSymbols;
    203 
    204     uint32_t UndefinedSymbolsIndex;
    205     uint32_t NumUndefinedSymbols;
    206 
    207     uint32_t TOCOffset;
    208     uint32_t NumTOCEntries;
    209 
    210     uint32_t ModuleTableOffset;
    211     uint32_t NumModuleTableEntries;
    212 
    213     uint32_t ReferenceSymbolTableOffset;
    214     uint32_t NumReferencedSymbolTableEntries;
    215 
    216     uint32_t IndirectSymbolTableOffset;
    217     uint32_t NumIndirectSymbolTableEntries;
    218 
    219     uint32_t ExternalRelocationTableOffset;
    220     uint32_t NumExternalRelocationTableEntries;
    221 
    222     uint32_t LocalRelocationTableOffset;
    223     uint32_t NumLocalRelocationTableEntries;
    224   };
    225 
    226   struct LinkeditDataLoadCommand {
    227     uint32_t Type;
    228     uint32_t Size;
    229     uint32_t DataOffset;
    230     uint32_t DataSize;
    231   };
    232 
    233   /// @}
    234   /// @name Section Data
    235   /// @{
    236 
    237   struct Section {
    238     char Name[16];
    239     char SegmentName[16];
    240     uint32_t Address;
    241     uint32_t Size;
    242     uint32_t Offset;
    243     uint32_t Align;
    244     uint32_t RelocationTableOffset;
    245     uint32_t NumRelocationTableEntries;
    246     uint32_t Flags;
    247     uint32_t Reserved1;
    248     uint32_t Reserved2;
    249   };
    250   struct Section64 {
    251     char Name[16];
    252     char SegmentName[16];
    253     uint64_t Address;
    254     uint64_t Size;
    255     uint32_t Offset;
    256     uint32_t Align;
    257     uint32_t RelocationTableOffset;
    258     uint32_t NumRelocationTableEntries;
    259     uint32_t Flags;
    260     uint32_t Reserved1;
    261     uint32_t Reserved2;
    262     uint32_t Reserved3;
    263   };
    264 
    265   /// @}
    266   /// @name Symbol Table Entries
    267   /// @{
    268 
    269   struct SymbolTableEntry {
    270     uint32_t StringIndex;
    271     uint8_t Type;
    272     uint8_t SectionIndex;
    273     uint16_t Flags;
    274     uint32_t Value;
    275   };
    276   // Despite containing a uint64_t, this structure is only 4-byte aligned within
    277   // a MachO file.
    278 #pragma pack(push)
    279 #pragma pack(4)
    280   struct Symbol64TableEntry {
    281     uint32_t StringIndex;
    282     uint8_t Type;
    283     uint8_t SectionIndex;
    284     uint16_t Flags;
    285     uint64_t Value;
    286   };
    287 #pragma pack(pop)
    288 
    289   /// @}
    290   /// @name Data-in-code Table Entry
    291   /// @{
    292 
    293   // See <mach-o/loader.h>.
    294   enum DataRegionType { Data = 1, JumpTable8, JumpTable16, JumpTable32 };
    295   struct DataInCodeTableEntry {
    296     uint32_t Offset;  /* from mach_header to start of data region */
    297     uint16_t Length;  /* number of bytes in data region */
    298     uint16_t Kind;    /* a DataRegionType value  */
    299   };
    300 
    301   /// @}
    302   /// @name Indirect Symbol Table
    303   /// @{
    304 
    305   struct IndirectSymbolTableEntry {
    306     uint32_t Index;
    307   };
    308 
    309   /// @}
    310   /// @name Relocation Data
    311   /// @{
    312 
    313   struct RelocationEntry {
    314     uint32_t Word0;
    315     uint32_t Word1;
    316   };
    317 
    318   /// @}
    319 
    320   // See <mach-o/nlist.h>.
    321   enum SymbolTypeType {
    322     STT_Undefined = 0x00,
    323     STT_Absolute  = 0x02,
    324     STT_Section   = 0x0e
    325   };
    326 
    327   enum SymbolTypeFlags {
    328     // If any of these bits are set, then the entry is a stab entry number (see
    329     // <mach-o/stab.h>. Otherwise the other masks apply.
    330     STF_StabsEntryMask = 0xe0,
    331 
    332     STF_TypeMask       = 0x0e,
    333     STF_External       = 0x01,
    334     STF_PrivateExtern  = 0x10
    335   };
    336 
    337   /// IndirectSymbolFlags - Flags for encoding special values in the indirect
    338   /// symbol entry.
    339   enum IndirectSymbolFlags {
    340     ISF_Local    = 0x80000000,
    341     ISF_Absolute = 0x40000000
    342   };
    343 
    344   /// RelocationFlags - Special flags for addresses.
    345   enum RelocationFlags {
    346     RF_Scattered = 0x80000000
    347   };
    348 
    349   /// Common relocation info types.
    350   enum RelocationInfoType {
    351     RIT_Vanilla             = 0,
    352     RIT_Pair                = 1,
    353     RIT_Difference          = 2
    354   };
    355 
    356   /// Generic relocation info types, which are shared by some (but not all)
    357   /// platforms.
    358   enum RelocationInfoType_Generic {
    359     RIT_Generic_PreboundLazyPointer = 3,
    360     RIT_Generic_LocalDifference     = 4,
    361     RIT_Generic_TLV                 = 5
    362   };
    363 
    364   /// X86_64 uses its own relocation types.
    365   enum RelocationInfoTypeX86_64 {
    366     // Note that x86_64 doesn't even share the common relocation types.
    367     RIT_X86_64_Unsigned   = 0,
    368     RIT_X86_64_Signed     = 1,
    369     RIT_X86_64_Branch     = 2,
    370     RIT_X86_64_GOTLoad    = 3,
    371     RIT_X86_64_GOT        = 4,
    372     RIT_X86_64_Subtractor = 5,
    373     RIT_X86_64_Signed1    = 6,
    374     RIT_X86_64_Signed2    = 7,
    375     RIT_X86_64_Signed4    = 8,
    376     RIT_X86_64_TLV        = 9
    377   };
    378 
    379   /// ARM uses its own relocation types.
    380   enum RelocationInfoTypeARM {
    381     RIT_ARM_LocalDifference = 3,
    382     RIT_ARM_PreboundLazyPointer = 4,
    383     RIT_ARM_Branch24Bit = 5,
    384     RIT_ARM_ThumbBranch22Bit = 6,
    385     RIT_ARM_ThumbBranch32Bit = 7,
    386     RIT_ARM_Half = 8,
    387     RIT_ARM_HalfDifference = 9
    388 
    389   };
    390 
    391 } // end namespace macho
    392 
    393 } // end namespace object
    394 } // end namespace llvm
    395 
    396 #endif
    397