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