• 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   };
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