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   };
    102 
    103   /// \brief Constants for header magic field.
    104   enum HeaderMagic {
    105     HM_Object32 = 0xFEEDFACE,  ///< 32-bit mach object file
    106     HM_Object64 = 0xFEEDFACF,  ///< 64-bit mach object file
    107     HM_Universal = 0xCAFEBABE  ///< Universal object file
    108   };
    109 
    110   /// \brief Header common to all Mach object files.
    111   struct Header {
    112     uint32_t Magic;
    113     uint32_t CPUType;
    114     uint32_t CPUSubtype;
    115     uint32_t FileType;
    116     uint32_t NumLoadCommands;
    117     uint32_t SizeOfLoadCommands;
    118     uint32_t Flags;
    119   };
    120 
    121   /// \brief Extended header for 64-bit object files.
    122   struct Header64Ext {
    123     uint32_t Reserved;
    124   };
    125 
    126   // See <mach-o/loader.h>.
    127   enum HeaderFileType {
    128     HFT_Object = 0x1
    129   };
    130 
    131   enum HeaderFlags {
    132     HF_SubsectionsViaSymbols = 0x2000
    133   };
    134 
    135   enum LoadCommandType {
    136     LCT_Segment = 0x1,
    137     LCT_Symtab = 0x2,
    138     LCT_Dysymtab = 0xb,
    139     LCT_Segment64 = 0x19,
    140     LCT_UUID = 0x1b,
    141     LCT_CodeSignature = 0x1d,
    142     LCT_SegmentSplitInfo = 0x1e,
    143     LCT_FunctionStarts = 0x26
    144   };
    145 
    146   /// \brief Load command structure.
    147   struct LoadCommand {
    148     uint32_t Type;
    149     uint32_t Size;
    150   };
    151 
    152   /// @name Load Command Structures
    153   /// @{
    154 
    155   struct SegmentLoadCommand {
    156     uint32_t Type;
    157     uint32_t Size;
    158     char Name[16];
    159     uint32_t VMAddress;
    160     uint32_t VMSize;
    161     uint32_t FileOffset;
    162     uint32_t FileSize;
    163     uint32_t MaxVMProtection;
    164     uint32_t InitialVMProtection;
    165     uint32_t NumSections;
    166     uint32_t Flags;
    167   };
    168 
    169   struct Segment64LoadCommand {
    170     uint32_t Type;
    171     uint32_t Size;
    172     char Name[16];
    173     uint64_t VMAddress;
    174     uint64_t VMSize;
    175     uint64_t FileOffset;
    176     uint64_t FileSize;
    177     uint32_t MaxVMProtection;
    178     uint32_t InitialVMProtection;
    179     uint32_t NumSections;
    180     uint32_t Flags;
    181   };
    182 
    183   struct SymtabLoadCommand {
    184     uint32_t Type;
    185     uint32_t Size;
    186     uint32_t SymbolTableOffset;
    187     uint32_t NumSymbolTableEntries;
    188     uint32_t StringTableOffset;
    189     uint32_t StringTableSize;
    190   };
    191 
    192   struct DysymtabLoadCommand {
    193     uint32_t Type;
    194     uint32_t Size;
    195 
    196     uint32_t LocalSymbolsIndex;
    197     uint32_t NumLocalSymbols;
    198 
    199     uint32_t ExternalSymbolsIndex;
    200     uint32_t NumExternalSymbols;
    201 
    202     uint32_t UndefinedSymbolsIndex;
    203     uint32_t NumUndefinedSymbols;
    204 
    205     uint32_t TOCOffset;
    206     uint32_t NumTOCEntries;
    207 
    208     uint32_t ModuleTableOffset;
    209     uint32_t NumModuleTableEntries;
    210 
    211     uint32_t ReferenceSymbolTableOffset;
    212     uint32_t NumReferencedSymbolTableEntries;
    213 
    214     uint32_t IndirectSymbolTableOffset;
    215     uint32_t NumIndirectSymbolTableEntries;
    216 
    217     uint32_t ExternalRelocationTableOffset;
    218     uint32_t NumExternalRelocationTableEntries;
    219 
    220     uint32_t LocalRelocationTableOffset;
    221     uint32_t NumLocalRelocationTableEntries;
    222   };
    223 
    224   struct LinkeditDataLoadCommand {
    225     uint32_t Type;
    226     uint32_t Size;
    227     uint32_t DataOffset;
    228     uint32_t DataSize;
    229   };
    230 
    231   /// @}
    232   /// @name Section Data
    233   /// @{
    234 
    235   struct Section {
    236     char Name[16];
    237     char SegmentName[16];
    238     uint32_t Address;
    239     uint32_t Size;
    240     uint32_t Offset;
    241     uint32_t Align;
    242     uint32_t RelocationTableOffset;
    243     uint32_t NumRelocationTableEntries;
    244     uint32_t Flags;
    245     uint32_t Reserved1;
    246     uint32_t Reserved2;
    247   };
    248   struct Section64 {
    249     char Name[16];
    250     char SegmentName[16];
    251     uint64_t Address;
    252     uint64_t Size;
    253     uint32_t Offset;
    254     uint32_t Align;
    255     uint32_t RelocationTableOffset;
    256     uint32_t NumRelocationTableEntries;
    257     uint32_t Flags;
    258     uint32_t Reserved1;
    259     uint32_t Reserved2;
    260     uint32_t Reserved3;
    261   };
    262 
    263   /// @}
    264   /// @name Symbol Table Entries
    265   /// @{
    266 
    267   struct SymbolTableEntry {
    268     uint32_t StringIndex;
    269     uint8_t Type;
    270     uint8_t SectionIndex;
    271     uint16_t Flags;
    272     uint32_t Value;
    273   };
    274   struct Symbol64TableEntry {
    275     uint32_t StringIndex;
    276     uint8_t Type;
    277     uint8_t SectionIndex;
    278     uint16_t Flags;
    279     uint64_t Value;
    280   };
    281 
    282   /// @}
    283   /// @name Indirect Symbol Table
    284   /// @{
    285 
    286   struct IndirectSymbolTableEntry {
    287     uint32_t Index;
    288   };
    289 
    290   /// @}
    291   /// @name Relocation Data
    292   /// @{
    293 
    294   struct RelocationEntry {
    295     uint32_t Word0;
    296     uint32_t Word1;
    297   };
    298 
    299   /// @}
    300 
    301   // See <mach-o/nlist.h>.
    302   enum SymbolTypeType {
    303     STT_Undefined = 0x00,
    304     STT_Absolute  = 0x02,
    305     STT_Section   = 0x0e
    306   };
    307 
    308   enum SymbolTypeFlags {
    309     // If any of these bits are set, then the entry is a stab entry number (see
    310     // <mach-o/stab.h>. Otherwise the other masks apply.
    311     STF_StabsEntryMask = 0xe0,
    312 
    313     STF_TypeMask       = 0x0e,
    314     STF_External       = 0x01,
    315     STF_PrivateExtern  = 0x10
    316   };
    317 
    318   /// IndirectSymbolFlags - Flags for encoding special values in the indirect
    319   /// symbol entry.
    320   enum IndirectSymbolFlags {
    321     ISF_Local    = 0x80000000,
    322     ISF_Absolute = 0x40000000
    323   };
    324 
    325   /// RelocationFlags - Special flags for addresses.
    326   enum RelocationFlags {
    327     RF_Scattered = 0x80000000
    328   };
    329 
    330   /// Common relocation info types.
    331   enum RelocationInfoType {
    332     RIT_Vanilla             = 0,
    333     RIT_Pair                = 1,
    334     RIT_Difference          = 2
    335   };
    336 
    337   /// Generic relocation info types, which are shared by some (but not all)
    338   /// platforms.
    339   enum RelocationInfoType_Generic {
    340     RIT_Generic_PreboundLazyPointer = 3,
    341     RIT_Generic_LocalDifference     = 4,
    342     RIT_Generic_TLV                 = 5
    343   };
    344 
    345   /// X86_64 uses its own relocation types.
    346   enum RelocationInfoTypeX86_64 {
    347     // Note that x86_64 doesn't even share the common relocation types.
    348     RIT_X86_64_Unsigned   = 0,
    349     RIT_X86_64_Signed     = 1,
    350     RIT_X86_64_Branch     = 2,
    351     RIT_X86_64_GOTLoad    = 3,
    352     RIT_X86_64_GOT        = 4,
    353     RIT_X86_64_Subtractor = 5,
    354     RIT_X86_64_Signed1    = 6,
    355     RIT_X86_64_Signed2    = 7,
    356     RIT_X86_64_Signed4    = 8,
    357     RIT_X86_64_TLV        = 9
    358   };
    359 
    360   /// ARM uses its own relocation types.
    361   enum RelocationInfoTypeARM {
    362     RIT_ARM_LocalDifference = 3,
    363     RIT_ARM_PreboundLazyPointer = 4,
    364     RIT_ARM_Branch24Bit = 5,
    365     RIT_ARM_ThumbBranch22Bit = 6,
    366     RIT_ARM_ThumbBranch32Bit = 7,
    367     RIT_ARM_Half = 8,
    368     RIT_ARM_HalfDifference = 9
    369 
    370   };
    371 
    372 } // end namespace macho
    373 
    374 } // end namespace object
    375 } // end namespace llvm
    376 
    377 #endif
    378