• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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