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     CSARM_V7F    = 10,
     66     CSARM_V7S    = 11,
     67     CSARM_V7K    = 12,
     68     CSARM_V6M    = 14,
     69     CSARM_V7M    = 15,
     70     CSARM_V7EM   = 16
     71   };
     72 
     73   /// \brief PowerPC Machine Subtypes.
     74   enum CPUSubtypePowerPC {
     75     CSPPC_ALL = 0
     76   };
     77 
     78   /// \brief SPARC Machine Subtypes.
     79   enum CPUSubtypeSPARC {
     80     CSSPARC_ALL = 0
     81   };
     82 
     83   /// \brief x86 Machine Subtypes.
     84   enum CPUSubtypeX86 {
     85     CSX86_ALL = 3
     86   };
     87 
     88   /// @}
     89 
     90 } // end namespace mach
     91 
     92 /// Format information for Mach object files.
     93 namespace macho {
     94   /// \brief Constants for structure sizes.
     95   enum StructureSizes {
     96     Header32Size = 28,
     97     Header64Size = 32,
     98     FatHeaderSize = 8,
     99     FatArchHeaderSize = 20,
    100     SegmentLoadCommand32Size = 56,
    101     SegmentLoadCommand64Size = 72,
    102     Section32Size = 68,
    103     Section64Size = 80,
    104     SymtabLoadCommandSize = 24,
    105     DysymtabLoadCommandSize = 80,
    106     Nlist32Size = 12,
    107     Nlist64Size = 16,
    108     RelocationInfoSize = 8,
    109     LinkeditLoadCommandSize = 16
    110   };
    111 
    112   /// \brief Constants for header magic field.
    113   enum HeaderMagic {
    114     HM_Object32 = 0xFEEDFACE,  ///< 32-bit mach object file
    115     HM_Object64 = 0xFEEDFACF,  ///< 64-bit mach object file
    116     HM_Universal = 0xCAFEBABE  ///< Universal object file
    117   };
    118 
    119   /// \brief Header common to all Mach object files.
    120   struct Header {
    121     uint32_t Magic;
    122     uint32_t CPUType;
    123     uint32_t CPUSubtype;
    124     uint32_t FileType;
    125     uint32_t NumLoadCommands;
    126     uint32_t SizeOfLoadCommands;
    127     uint32_t Flags;
    128   };
    129 
    130   /// \brief Extended header for 64-bit object files.
    131   struct Header64Ext {
    132     uint32_t Reserved;
    133   };
    134 
    135   /// \brief Header for universal object files.
    136   struct FatHeader {
    137     uint32_t Magic;
    138     uint32_t NumFatArch;
    139   };
    140 
    141   /// \brief Header for a single-architecture object file in a
    142   /// universal binary.
    143   struct FatArchHeader {
    144     uint32_t CPUType;
    145     uint32_t CPUSubtype;
    146     uint32_t Offset;
    147     uint32_t Size;
    148     uint32_t Align;
    149   };
    150 
    151   // See <mach-o/loader.h>.
    152   enum HeaderFileType {
    153     HFT_Object = 0x1
    154   };
    155 
    156   enum HeaderFlags {
    157     HF_SubsectionsViaSymbols = 0x2000
    158   };
    159 
    160   enum LoadCommandType {
    161     LCT_Segment = 0x1,
    162     LCT_Symtab = 0x2,
    163     LCT_Dysymtab = 0xb,
    164     LCT_Segment64 = 0x19,
    165     LCT_UUID = 0x1b,
    166     LCT_CodeSignature = 0x1d,
    167     LCT_SegmentSplitInfo = 0x1e,
    168     LCT_FunctionStarts = 0x26,
    169     LCT_DataInCode = 0x29,
    170     LCT_LinkerOptions = 0x2D
    171   };
    172 
    173   /// \brief Load command structure.
    174   struct LoadCommand {
    175     uint32_t Type;
    176     uint32_t Size;
    177   };
    178 
    179   /// @name Load Command Structures
    180   /// @{
    181 
    182   struct SegmentLoadCommand {
    183     uint32_t Type;
    184     uint32_t Size;
    185     char Name[16];
    186     uint32_t VMAddress;
    187     uint32_t VMSize;
    188     uint32_t FileOffset;
    189     uint32_t FileSize;
    190     uint32_t MaxVMProtection;
    191     uint32_t InitialVMProtection;
    192     uint32_t NumSections;
    193     uint32_t Flags;
    194   };
    195 
    196   struct Segment64LoadCommand {
    197     uint32_t Type;
    198     uint32_t Size;
    199     char Name[16];
    200     uint64_t VMAddress;
    201     uint64_t VMSize;
    202     uint64_t FileOffset;
    203     uint64_t FileSize;
    204     uint32_t MaxVMProtection;
    205     uint32_t InitialVMProtection;
    206     uint32_t NumSections;
    207     uint32_t Flags;
    208   };
    209 
    210   struct SymtabLoadCommand {
    211     uint32_t Type;
    212     uint32_t Size;
    213     uint32_t SymbolTableOffset;
    214     uint32_t NumSymbolTableEntries;
    215     uint32_t StringTableOffset;
    216     uint32_t StringTableSize;
    217   };
    218 
    219   struct DysymtabLoadCommand {
    220     uint32_t Type;
    221     uint32_t Size;
    222 
    223     uint32_t LocalSymbolsIndex;
    224     uint32_t NumLocalSymbols;
    225 
    226     uint32_t ExternalSymbolsIndex;
    227     uint32_t NumExternalSymbols;
    228 
    229     uint32_t UndefinedSymbolsIndex;
    230     uint32_t NumUndefinedSymbols;
    231 
    232     uint32_t TOCOffset;
    233     uint32_t NumTOCEntries;
    234 
    235     uint32_t ModuleTableOffset;
    236     uint32_t NumModuleTableEntries;
    237 
    238     uint32_t ReferenceSymbolTableOffset;
    239     uint32_t NumReferencedSymbolTableEntries;
    240 
    241     uint32_t IndirectSymbolTableOffset;
    242     uint32_t NumIndirectSymbolTableEntries;
    243 
    244     uint32_t ExternalRelocationTableOffset;
    245     uint32_t NumExternalRelocationTableEntries;
    246 
    247     uint32_t LocalRelocationTableOffset;
    248     uint32_t NumLocalRelocationTableEntries;
    249   };
    250 
    251   struct LinkeditDataLoadCommand {
    252     uint32_t Type;
    253     uint32_t Size;
    254     uint32_t DataOffset;
    255     uint32_t DataSize;
    256   };
    257 
    258   struct LinkerOptionsLoadCommand {
    259     uint32_t Type;
    260     uint32_t Size;
    261     uint32_t Count;
    262     // Load command is followed by Count number of zero-terminated UTF8 strings,
    263     // and then zero-filled to be 4-byte aligned.
    264   };
    265 
    266   /// @}
    267   /// @name Section Data
    268   /// @{
    269 
    270   enum SectionFlags {
    271     SF_PureInstructions = 0x80000000
    272   };
    273 
    274   struct Section {
    275     char Name[16];
    276     char SegmentName[16];
    277     uint32_t Address;
    278     uint32_t Size;
    279     uint32_t Offset;
    280     uint32_t Align;
    281     uint32_t RelocationTableOffset;
    282     uint32_t NumRelocationTableEntries;
    283     uint32_t Flags;
    284     uint32_t Reserved1;
    285     uint32_t Reserved2;
    286   };
    287   struct Section64 {
    288     char Name[16];
    289     char SegmentName[16];
    290     uint64_t Address;
    291     uint64_t Size;
    292     uint32_t Offset;
    293     uint32_t Align;
    294     uint32_t RelocationTableOffset;
    295     uint32_t NumRelocationTableEntries;
    296     uint32_t Flags;
    297     uint32_t Reserved1;
    298     uint32_t Reserved2;
    299     uint32_t Reserved3;
    300   };
    301 
    302   /// @}
    303   /// @name Symbol Table Entries
    304   /// @{
    305 
    306   struct SymbolTableEntry {
    307     uint32_t StringIndex;
    308     uint8_t Type;
    309     uint8_t SectionIndex;
    310     uint16_t Flags;
    311     uint32_t Value;
    312   };
    313   // Despite containing a uint64_t, this structure is only 4-byte aligned within
    314   // a MachO file.
    315 #pragma pack(push)
    316 #pragma pack(4)
    317   struct Symbol64TableEntry {
    318     uint32_t StringIndex;
    319     uint8_t Type;
    320     uint8_t SectionIndex;
    321     uint16_t Flags;
    322     uint64_t Value;
    323   };
    324 #pragma pack(pop)
    325 
    326   /// @}
    327   /// @name Data-in-code Table Entry
    328   /// @{
    329 
    330   // See <mach-o/loader.h>.
    331   enum DataRegionType { Data = 1, JumpTable8, JumpTable16, JumpTable32 };
    332   struct DataInCodeTableEntry {
    333     uint32_t Offset;  /* from mach_header to start of data region */
    334     uint16_t Length;  /* number of bytes in data region */
    335     uint16_t Kind;    /* a DataRegionType value  */
    336   };
    337 
    338   /// @}
    339   /// @name Indirect Symbol Table
    340   /// @{
    341 
    342   struct IndirectSymbolTableEntry {
    343     uint32_t Index;
    344   };
    345 
    346   /// @}
    347   /// @name Relocation Data
    348   /// @{
    349 
    350   struct RelocationEntry {
    351     uint32_t Word0;
    352     uint32_t Word1;
    353   };
    354 
    355   /// @}
    356 
    357   // See <mach-o/nlist.h>.
    358   enum SymbolTypeType {
    359     STT_Undefined = 0x00,
    360     STT_Absolute  = 0x02,
    361     STT_Section   = 0x0e
    362   };
    363 
    364   enum SymbolTypeFlags {
    365     // If any of these bits are set, then the entry is a stab entry number (see
    366     // <mach-o/stab.h>. Otherwise the other masks apply.
    367     STF_StabsEntryMask = 0xe0,
    368 
    369     STF_TypeMask       = 0x0e,
    370     STF_External       = 0x01,
    371     STF_PrivateExtern  = 0x10
    372   };
    373 
    374   /// IndirectSymbolFlags - Flags for encoding special values in the indirect
    375   /// symbol entry.
    376   enum IndirectSymbolFlags {
    377     ISF_Local    = 0x80000000,
    378     ISF_Absolute = 0x40000000
    379   };
    380 
    381   /// RelocationFlags - Special flags for addresses.
    382   enum RelocationFlags {
    383     RF_Scattered = 0x80000000
    384   };
    385 
    386   /// Common relocation info types.
    387   enum RelocationInfoType {
    388     RIT_Vanilla             = 0,
    389     RIT_Pair                = 1,
    390     RIT_Difference          = 2
    391   };
    392 
    393   /// Generic relocation info types, which are shared by some (but not all)
    394   /// platforms.
    395   enum RelocationInfoType_Generic {
    396     RIT_Generic_PreboundLazyPointer = 3,
    397     RIT_Generic_LocalDifference     = 4,
    398     RIT_Generic_TLV                 = 5
    399   };
    400 
    401   /// X86_64 uses its own relocation types.
    402   enum RelocationInfoTypeX86_64 {
    403     // Note that x86_64 doesn't even share the common relocation types.
    404     RIT_X86_64_Unsigned   = 0,
    405     RIT_X86_64_Signed     = 1,
    406     RIT_X86_64_Branch     = 2,
    407     RIT_X86_64_GOTLoad    = 3,
    408     RIT_X86_64_GOT        = 4,
    409     RIT_X86_64_Subtractor = 5,
    410     RIT_X86_64_Signed1    = 6,
    411     RIT_X86_64_Signed2    = 7,
    412     RIT_X86_64_Signed4    = 8,
    413     RIT_X86_64_TLV        = 9
    414   };
    415 
    416   /// ARM uses its own relocation types.
    417   enum RelocationInfoTypeARM {
    418     RIT_ARM_LocalDifference = 3,
    419     RIT_ARM_PreboundLazyPointer = 4,
    420     RIT_ARM_Branch24Bit = 5,
    421     RIT_ARM_ThumbBranch22Bit = 6,
    422     RIT_ARM_ThumbBranch32Bit = 7,
    423     RIT_ARM_Half = 8,
    424     RIT_ARM_HalfDifference = 9
    425 
    426   };
    427 
    428 } // end namespace macho
    429 
    430 } // end namespace object
    431 } // end namespace llvm
    432 
    433 #endif
    434