LLVM  3.7.0
Support/MachO.h
Go to the documentation of this file.
1 //===-- llvm/Support/MachO.h - The MachO file format ------------*- 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 defines manifest constants for the MachO object file format.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_SUPPORT_MACHO_H
15 #define LLVM_SUPPORT_MACHO_H
16 
17 #include "llvm/Support/Compiler.h"
18 #include "llvm/Support/DataTypes.h"
19 #include "llvm/Support/Host.h"
20 
21 namespace llvm {
22  namespace MachO {
23  // Enums from <mach-o/loader.h>
24  enum : uint32_t {
25  // Constants for the "magic" field in llvm::MachO::mach_header and
26  // llvm::MachO::mach_header_64
27  MH_MAGIC = 0xFEEDFACEu,
28  MH_CIGAM = 0xCEFAEDFEu,
29  MH_MAGIC_64 = 0xFEEDFACFu,
30  MH_CIGAM_64 = 0xCFFAEDFEu,
31  FAT_MAGIC = 0xCAFEBABEu,
32  FAT_CIGAM = 0xBEBAFECAu
33  };
34 
36  // Constants for the "filetype" field in llvm::MachO::mach_header and
37  // llvm::MachO::mach_header_64
38  MH_OBJECT = 0x1u,
39  MH_EXECUTE = 0x2u,
40  MH_FVMLIB = 0x3u,
41  MH_CORE = 0x4u,
42  MH_PRELOAD = 0x5u,
43  MH_DYLIB = 0x6u,
44  MH_DYLINKER = 0x7u,
45  MH_BUNDLE = 0x8u,
46  MH_DYLIB_STUB = 0x9u,
47  MH_DSYM = 0xAu,
49  };
50 
51  enum {
52  // Constant bits for the "flags" field in llvm::MachO::mach_header and
53  // llvm::MachO::mach_header_64
54  MH_NOUNDEFS = 0x00000001u,
55  MH_INCRLINK = 0x00000002u,
56  MH_DYLDLINK = 0x00000004u,
57  MH_BINDATLOAD = 0x00000008u,
58  MH_PREBOUND = 0x00000010u,
59  MH_SPLIT_SEGS = 0x00000020u,
60  MH_LAZY_INIT = 0x00000040u,
61  MH_TWOLEVEL = 0x00000080u,
62  MH_FORCE_FLAT = 0x00000100u,
63  MH_NOMULTIDEFS = 0x00000200u,
64  MH_NOFIXPREBINDING = 0x00000400u,
65  MH_PREBINDABLE = 0x00000800u,
66  MH_ALLMODSBOUND = 0x00001000u,
68  MH_CANONICAL = 0x00004000u,
69  MH_WEAK_DEFINES = 0x00008000u,
70  MH_BINDS_TO_WEAK = 0x00010000u,
71  MH_ALLOW_STACK_EXECUTION = 0x00020000u,
72  MH_ROOT_SAFE = 0x00040000u,
73  MH_SETUID_SAFE = 0x00080000u,
74  MH_NO_REEXPORTED_DYLIBS = 0x00100000u,
75  MH_PIE = 0x00200000u,
76  MH_DEAD_STRIPPABLE_DYLIB = 0x00400000u,
77  MH_HAS_TLV_DESCRIPTORS = 0x00800000u,
78  MH_NO_HEAP_EXECUTION = 0x01000000u,
79  MH_APP_EXTENSION_SAFE = 0x02000000u
80  };
81 
82  enum : uint32_t {
83  // Flags for the "cmd" field in llvm::MachO::load_command
84  LC_REQ_DYLD = 0x80000000u
85  };
86 
87  enum LoadCommandType : uint32_t {
88  // Constants for the "cmd" field in llvm::MachO::load_command
89  LC_SEGMENT = 0x00000001u,
90  LC_SYMTAB = 0x00000002u,
91  LC_SYMSEG = 0x00000003u,
92  LC_THREAD = 0x00000004u,
93  LC_UNIXTHREAD = 0x00000005u,
94  LC_LOADFVMLIB = 0x00000006u,
95  LC_IDFVMLIB = 0x00000007u,
96  LC_IDENT = 0x00000008u,
97  LC_FVMFILE = 0x00000009u,
98  LC_PREPAGE = 0x0000000Au,
99  LC_DYSYMTAB = 0x0000000Bu,
100  LC_LOAD_DYLIB = 0x0000000Cu,
101  LC_ID_DYLIB = 0x0000000Du,
102  LC_LOAD_DYLINKER = 0x0000000Eu,
103  LC_ID_DYLINKER = 0x0000000Fu,
104  LC_PREBOUND_DYLIB = 0x00000010u,
105  LC_ROUTINES = 0x00000011u,
106  LC_SUB_FRAMEWORK = 0x00000012u,
107  LC_SUB_UMBRELLA = 0x00000013u,
108  LC_SUB_CLIENT = 0x00000014u,
109  LC_SUB_LIBRARY = 0x00000015u,
110  LC_TWOLEVEL_HINTS = 0x00000016u,
111  LC_PREBIND_CKSUM = 0x00000017u,
112  LC_LOAD_WEAK_DYLIB = 0x80000018u,
113  LC_SEGMENT_64 = 0x00000019u,
114  LC_ROUTINES_64 = 0x0000001Au,
115  LC_UUID = 0x0000001Bu,
116  LC_RPATH = 0x8000001Cu,
117  LC_CODE_SIGNATURE = 0x0000001Du,
118  LC_SEGMENT_SPLIT_INFO = 0x0000001Eu,
119  LC_REEXPORT_DYLIB = 0x8000001Fu,
120  LC_LAZY_LOAD_DYLIB = 0x00000020u,
121  LC_ENCRYPTION_INFO = 0x00000021u,
122  LC_DYLD_INFO = 0x00000022u,
123  LC_DYLD_INFO_ONLY = 0x80000022u,
124  LC_LOAD_UPWARD_DYLIB = 0x80000023u,
125  LC_VERSION_MIN_MACOSX = 0x00000024u,
126  LC_VERSION_MIN_IPHONEOS = 0x00000025u,
127  LC_FUNCTION_STARTS = 0x00000026u,
128  LC_DYLD_ENVIRONMENT = 0x00000027u,
129  LC_MAIN = 0x80000028u,
130  LC_DATA_IN_CODE = 0x00000029u,
131  LC_SOURCE_VERSION = 0x0000002Au,
132  LC_DYLIB_CODE_SIGN_DRS = 0x0000002Bu,
133  LC_ENCRYPTION_INFO_64 = 0x0000002Cu,
134  LC_LINKER_OPTION = 0x0000002Du,
136  };
137 
138  enum : uint32_t {
139  // Constant bits for the "flags" field in llvm::MachO::segment_command
140  SG_HIGHVM = 0x1u,
141  SG_FVMLIB = 0x2u,
142  SG_NORELOC = 0x4u,
144 
145 
146  // Constant masks for the "flags" field in llvm::MachO::section and
147  // llvm::MachO::section_64
148  SECTION_TYPE = 0x000000ffu, // SECTION_TYPE
149  SECTION_ATTRIBUTES = 0xffffff00u, // SECTION_ATTRIBUTES
150  SECTION_ATTRIBUTES_USR = 0xff000000u, // SECTION_ATTRIBUTES_USR
151  SECTION_ATTRIBUTES_SYS = 0x00ffff00u // SECTION_ATTRIBUTES_SYS
152  };
153 
154  /// These are the section type and attributes fields. A MachO section can
155  /// have only one Type, but can have any of the attributes specified.
156  enum SectionType : uint32_t {
157  // Constant masks for the "flags[7:0]" field in llvm::MachO::section and
158  // llvm::MachO::section_64 (mask "flags" with SECTION_TYPE)
159 
160  /// S_REGULAR - Regular section.
161  S_REGULAR = 0x00u,
162  /// S_ZEROFILL - Zero fill on demand section.
163  S_ZEROFILL = 0x01u,
164  /// S_CSTRING_LITERALS - Section with literal C strings.
166  /// S_4BYTE_LITERALS - Section with 4 byte literals.
168  /// S_8BYTE_LITERALS - Section with 8 byte literals.
170  /// S_LITERAL_POINTERS - Section with pointers to literals.
172  /// S_NON_LAZY_SYMBOL_POINTERS - Section with non-lazy symbol pointers.
174  /// S_LAZY_SYMBOL_POINTERS - Section with lazy symbol pointers.
176  /// S_SYMBOL_STUBS - Section with symbol stubs, byte size of stub in
177  /// the Reserved2 field.
178  S_SYMBOL_STUBS = 0x08u,
179  /// S_MOD_INIT_FUNC_POINTERS - Section with only function pointers for
180  /// initialization.
182  /// S_MOD_TERM_FUNC_POINTERS - Section with only function pointers for
183  /// termination.
185  /// S_COALESCED - Section contains symbols that are to be coalesced.
186  S_COALESCED = 0x0bu,
187  /// S_GB_ZEROFILL - Zero fill on demand section (that can be larger than 4
188  /// gigabytes).
189  S_GB_ZEROFILL = 0x0cu,
190  /// S_INTERPOSING - Section with only pairs of function pointers for
191  /// interposing.
192  S_INTERPOSING = 0x0du,
193  /// S_16BYTE_LITERALS - Section with only 16 byte literals.
195  /// S_DTRACE_DOF - Section contains DTrace Object Format.
196  S_DTRACE_DOF = 0x0fu,
197  /// S_LAZY_DYLIB_SYMBOL_POINTERS - Section with lazy symbol pointers to
198  /// lazy loaded dylibs.
200  /// S_THREAD_LOCAL_REGULAR - Thread local data section.
202  /// S_THREAD_LOCAL_ZEROFILL - Thread local zerofill section.
204  /// S_THREAD_LOCAL_VARIABLES - Section with thread local variable
205  /// structure data.
207  /// S_THREAD_LOCAL_VARIABLE_POINTERS - Section with pointers to thread
208  /// local structures.
210  /// S_THREAD_LOCAL_INIT_FUNCTION_POINTERS - Section with thread local
211  /// variable initialization pointers to functions.
213 
215  };
216 
217  enum : uint32_t {
218  // Constant masks for the "flags[31:24]" field in llvm::MachO::section and
219  // llvm::MachO::section_64 (mask "flags" with SECTION_ATTRIBUTES_USR)
220 
221  /// S_ATTR_PURE_INSTRUCTIONS - Section contains only true machine
222  /// instructions.
224  /// S_ATTR_NO_TOC - Section contains coalesced symbols that are not to be
225  /// in a ranlib table of contents.
226  S_ATTR_NO_TOC = 0x40000000u,
227  /// S_ATTR_STRIP_STATIC_SYMS - Ok to strip static symbols in this section
228  /// in files with the MY_DYLDLINK flag.
230  /// S_ATTR_NO_DEAD_STRIP - No dead stripping.
231  S_ATTR_NO_DEAD_STRIP = 0x10000000u,
232  /// S_ATTR_LIVE_SUPPORT - Blocks are live if they reference live blocks.
233  S_ATTR_LIVE_SUPPORT = 0x08000000u,
234  /// S_ATTR_SELF_MODIFYING_CODE - Used with i386 code stubs written on by
235  /// dyld.
237  /// S_ATTR_DEBUG - A debug section.
238  S_ATTR_DEBUG = 0x02000000u,
239 
240  // Constant masks for the "flags[23:8]" field in llvm::MachO::section and
241  // llvm::MachO::section_64 (mask "flags" with SECTION_ATTRIBUTES_SYS)
242 
243  /// S_ATTR_SOME_INSTRUCTIONS - Section contains some machine instructions.
245  /// S_ATTR_EXT_RELOC - Section has external relocation entries.
246  S_ATTR_EXT_RELOC = 0x00000200u,
247  /// S_ATTR_LOC_RELOC - Section has local relocation entries.
248  S_ATTR_LOC_RELOC = 0x00000100u,
249 
250  // Constant masks for the value of an indirect symbol in an indirect
251  // symbol table
252  INDIRECT_SYMBOL_LOCAL = 0x80000000u,
253  INDIRECT_SYMBOL_ABS = 0x40000000u
254  };
255 
257  // Constants for the "kind" field in a data_in_code_entry structure
263  };
264 
265  enum RebaseType {
269  };
270 
271  enum {
274  };
275 
286  };
287 
288  enum BindType {
292  };
293 
298  };
299 
300  enum {
303 
306  };
307 
308  enum BindOpcode {
322  };
323 
324  enum {
329  };
330 
335  };
336 
337 
338  enum {
339  // Constant masks for the "n_type" field in llvm::MachO::nlist and
340  // llvm::MachO::nlist_64
341  N_STAB = 0xe0,
342  N_PEXT = 0x10,
343  N_TYPE = 0x0e,
344  N_EXT = 0x01
345  };
346 
347  enum NListType {
348  // Constants for the "n_type & N_TYPE" llvm::MachO::nlist and
349  // llvm::MachO::nlist_64
350  N_UNDF = 0x0u,
351  N_ABS = 0x2u,
352  N_SECT = 0xeu,
353  N_PBUD = 0xcu,
354  N_INDR = 0xau
355  };
356 
358  // Constants for the "n_sect" field in llvm::MachO::nlist and
359  // llvm::MachO::nlist_64
360  NO_SECT = 0u,
361  MAX_SECT = 0xffu
362  };
363 
364  enum {
365  // Constant masks for the "n_desc" field in llvm::MachO::nlist and
366  // llvm::MachO::nlist_64
367  // The low 3 bits are the for the REFERENCE_TYPE.
375  // Flag bits (some overlap with the library ordinal bits).
376  N_ARM_THUMB_DEF = 0x0008u,
378  N_NO_DEAD_STRIP = 0x0020u,
379  N_WEAK_REF = 0x0040u,
380  N_WEAK_DEF = 0x0080u,
381  N_SYMBOL_RESOLVER = 0x0100u,
382  N_ALT_ENTRY = 0x0200u,
383  // For undefined symbols coming from libraries, see GET_LIBRARY_ORDINAL()
384  // as these are in the top 8 bits.
389  };
390 
391  enum StabType {
392  // Constant values for the "n_type" field in llvm::MachO::nlist and
393  // llvm::MachO::nlist_64 when "(n_type & N_STAB) != 0"
394  N_GSYM = 0x20u,
395  N_FNAME = 0x22u,
396  N_FUN = 0x24u,
397  N_STSYM = 0x26u,
398  N_LCSYM = 0x28u,
399  N_BNSYM = 0x2Eu,
400  N_PC = 0x30u,
401  N_AST = 0x32u,
402  N_OPT = 0x3Cu,
403  N_RSYM = 0x40u,
404  N_SLINE = 0x44u,
405  N_ENSYM = 0x4Eu,
406  N_SSYM = 0x60u,
407  N_SO = 0x64u,
408  N_OSO = 0x66u,
409  N_LSYM = 0x80u,
410  N_BINCL = 0x82u,
411  N_SOL = 0x84u,
412  N_PARAMS = 0x86u,
413  N_VERSION = 0x88u,
414  N_OLEVEL = 0x8Au,
415  N_PSYM = 0xA0u,
416  N_EINCL = 0xA2u,
417  N_ENTRY = 0xA4u,
418  N_LBRAC = 0xC0u,
419  N_EXCL = 0xC2u,
420  N_RBRAC = 0xE0u,
421  N_BCOMM = 0xE2u,
422  N_ECOMM = 0xE4u,
423  N_ECOML = 0xE8u,
424  N_LENG = 0xFEu
425  };
426 
427  enum : uint32_t {
428  // Constant values for the r_symbolnum field in an
429  // llvm::MachO::relocation_info structure when r_extern is 0.
430  R_ABS = 0,
431 
432  // Constant bits for the r_address field in an
433  // llvm::MachO::relocation_info structure.
434  R_SCATTERED = 0x80000000
435  };
436 
438  // Constant values for the r_type field in an
439  // llvm::MachO::relocation_info or llvm::MachO::scattered_relocation_info
440  // structure.
447 
448  // Constant values for the r_type field in a PowerPC architecture
449  // llvm::MachO::relocation_info or llvm::MachO::scattered_relocation_info
450  // structure.
467 
468  // Constant values for the r_type field in an ARM architecture
469  // llvm::MachO::relocation_info or llvm::MachO::scattered_relocation_info
470  // structure.
478  ARM_THUMB_32BIT_BRANCH = 7, // obsolete
481 
482  // Constant values for the r_type field in an ARM64 architecture
483  // llvm::MachO::relocation_info or llvm::MachO::scattered_relocation_info
484  // structure.
485 
486  // For pointers.
488  // Must be followed by an ARM64_RELOC_UNSIGNED
490  // A B/BL instruction with 26-bit displacement.
492  // PC-rel distance to page of target.
494  // Offset within page, scaled by r_length.
496  // PC-rel distance to page of GOT slot.
498  // Offset within page of GOT slot, scaled by r_length.
500  // For pointers to GOT slots.
502  // PC-rel distance to page of TLVP slot.
504  // Offset within page of TLVP slot, scaled by r_length.
506  // Must be followed by ARM64_RELOC_PAGE21 or ARM64_RELOC_PAGEOFF12.
508 
509 
510  // Constant values for the r_type field in an x86_64 architecture
511  // llvm::MachO::relocation_info or llvm::MachO::scattered_relocation_info
512  // structure
523  };
524 
525  // Values for segment_command.initprot.
526  // From <mach/vm_prot.h>
527  enum {
531  };
532 
533 
534  // Structs from <mach-o/loader.h>
535 
536  struct mach_header {
537  uint32_t magic;
538  uint32_t cputype;
539  uint32_t cpusubtype;
540  uint32_t filetype;
541  uint32_t ncmds;
542  uint32_t sizeofcmds;
543  uint32_t flags;
544  };
545 
546  struct mach_header_64 {
547  uint32_t magic;
548  uint32_t cputype;
549  uint32_t cpusubtype;
550  uint32_t filetype;
551  uint32_t ncmds;
552  uint32_t sizeofcmds;
553  uint32_t flags;
554  uint32_t reserved;
555  };
556 
557  struct load_command {
558  uint32_t cmd;
559  uint32_t cmdsize;
560  };
561 
563  uint32_t cmd;
564  uint32_t cmdsize;
565  char segname[16];
566  uint32_t vmaddr;
567  uint32_t vmsize;
568  uint32_t fileoff;
569  uint32_t filesize;
570  uint32_t maxprot;
571  uint32_t initprot;
572  uint32_t nsects;
573  uint32_t flags;
574  };
575 
577  uint32_t cmd;
578  uint32_t cmdsize;
579  char segname[16];
580  uint64_t vmaddr;
581  uint64_t vmsize;
582  uint64_t fileoff;
583  uint64_t filesize;
584  uint32_t maxprot;
585  uint32_t initprot;
586  uint32_t nsects;
587  uint32_t flags;
588  };
589 
590  struct section {
591  char sectname[16];
592  char segname[16];
593  uint32_t addr;
594  uint32_t size;
595  uint32_t offset;
596  uint32_t align;
597  uint32_t reloff;
598  uint32_t nreloc;
599  uint32_t flags;
600  uint32_t reserved1;
601  uint32_t reserved2;
602  };
603 
604  struct section_64 {
605  char sectname[16];
606  char segname[16];
607  uint64_t addr;
608  uint64_t size;
609  uint32_t offset;
610  uint32_t align;
611  uint32_t reloff;
612  uint32_t nreloc;
613  uint32_t flags;
614  uint32_t reserved1;
615  uint32_t reserved2;
616  uint32_t reserved3;
617  };
618 
619  struct fvmlib {
620  uint32_t name;
621  uint32_t minor_version;
622  uint32_t header_addr;
623  };
624 
625  struct fvmlib_command {
626  uint32_t cmd;
627  uint32_t cmdsize;
628  struct fvmlib fvmlib;
629  };
630 
631  struct dylib {
632  uint32_t name;
633  uint32_t timestamp;
634  uint32_t current_version;
636  };
637 
638  struct dylib_command {
639  uint32_t cmd;
640  uint32_t cmdsize;
641  struct dylib dylib;
642  };
643 
645  uint32_t cmd;
646  uint32_t cmdsize;
647  uint32_t umbrella;
648  };
649 
651  uint32_t cmd;
652  uint32_t cmdsize;
653  uint32_t client;
654  };
655 
657  uint32_t cmd;
658  uint32_t cmdsize;
659  uint32_t sub_umbrella;
660  };
661 
663  uint32_t cmd;
664  uint32_t cmdsize;
665  uint32_t sub_library;
666  };
667 
669  uint32_t cmd;
670  uint32_t cmdsize;
671  uint32_t name;
672  uint32_t nmodules;
673  uint32_t linked_modules;
674  };
675 
677  uint32_t cmd;
678  uint32_t cmdsize;
679  uint32_t name;
680  };
681 
682  struct thread_command {
683  uint32_t cmd;
684  uint32_t cmdsize;
685  };
686 
688  uint32_t cmd;
689  uint32_t cmdsize;
690  uint32_t init_address;
691  uint32_t init_module;
692  uint32_t reserved1;
693  uint32_t reserved2;
694  uint32_t reserved3;
695  uint32_t reserved4;
696  uint32_t reserved5;
697  uint32_t reserved6;
698  };
699 
701  uint32_t cmd;
702  uint32_t cmdsize;
703  uint64_t init_address;
704  uint64_t init_module;
705  uint64_t reserved1;
706  uint64_t reserved2;
707  uint64_t reserved3;
708  uint64_t reserved4;
709  uint64_t reserved5;
710  uint64_t reserved6;
711  };
712 
713  struct symtab_command {
714  uint32_t cmd;
715  uint32_t cmdsize;
716  uint32_t symoff;
717  uint32_t nsyms;
718  uint32_t stroff;
719  uint32_t strsize;
720  };
721 
723  uint32_t cmd;
724  uint32_t cmdsize;
725  uint32_t ilocalsym;
726  uint32_t nlocalsym;
727  uint32_t iextdefsym;
728  uint32_t nextdefsym;
729  uint32_t iundefsym;
730  uint32_t nundefsym;
731  uint32_t tocoff;
732  uint32_t ntoc;
733  uint32_t modtaboff;
734  uint32_t nmodtab;
735  uint32_t extrefsymoff;
736  uint32_t nextrefsyms;
737  uint32_t indirectsymoff;
738  uint32_t nindirectsyms;
739  uint32_t extreloff;
740  uint32_t nextrel;
741  uint32_t locreloff;
742  uint32_t nlocrel;
743  };
744 
746  uint32_t symbol_index;
747  uint32_t module_index;
748  };
749 
750  struct dylib_module {
751  uint32_t module_name;
752  uint32_t iextdefsym;
753  uint32_t nextdefsym;
754  uint32_t irefsym;
755  uint32_t nrefsym;
756  uint32_t ilocalsym;
757  uint32_t nlocalsym;
758  uint32_t iextrel;
759  uint32_t nextrel;
760  uint32_t iinit_iterm;
761  uint32_t ninit_nterm;
764  };
765 
767  uint32_t module_name;
768  uint32_t iextdefsym;
769  uint32_t nextdefsym;
770  uint32_t irefsym;
771  uint32_t nrefsym;
772  uint32_t ilocalsym;
773  uint32_t nlocalsym;
774  uint32_t iextrel;
775  uint32_t nextrel;
776  uint32_t iinit_iterm;
777  uint32_t ninit_nterm;
780  };
781 
783  uint32_t isym:24,
784  flags:8;
785  };
786 
787 
789  uint32_t cmd;
790  uint32_t cmdsize;
791  uint32_t offset;
792  uint32_t nhints;
793  };
794 
795  struct twolevel_hint {
796  uint32_t isub_image:8,
797  itoc:24;
798  };
799 
801  uint32_t cmd;
802  uint32_t cmdsize;
803  uint32_t cksum;
804  };
805 
806  struct uuid_command {
807  uint32_t cmd;
808  uint32_t cmdsize;
809  uint8_t uuid[16];
810  };
811 
812  struct rpath_command {
813  uint32_t cmd;
814  uint32_t cmdsize;
815  uint32_t path;
816  };
817 
819  uint32_t cmd;
820  uint32_t cmdsize;
821  uint32_t dataoff;
822  uint32_t datasize;
823  };
824 
826  uint32_t offset;
827  uint16_t length;
828  uint16_t kind;
829  };
830 
832  uint32_t cmd;
833  uint32_t cmdsize;
834  uint64_t version;
835  };
836 
838  uint32_t cmd;
839  uint32_t cmdsize;
840  uint32_t cryptoff;
841  uint32_t cryptsize;
842  uint32_t cryptid;
843  };
844 
846  uint32_t cmd;
847  uint32_t cmdsize;
848  uint32_t cryptoff;
849  uint32_t cryptsize;
850  uint32_t cryptid;
851  uint32_t pad;
852  };
853 
855  uint32_t cmd; // LC_VERSION_MIN_MACOSX or
856  // LC_VERSION_MIN_IPHONEOS
857  uint32_t cmdsize; // sizeof(struct version_min_command)
858  uint32_t version; // X.Y.Z is encoded in nibbles xxxx.yy.zz
859  uint32_t sdk; // X.Y.Z is encoded in nibbles xxxx.yy.zz
860  };
861 
863  uint32_t cmd;
864  uint32_t cmdsize;
865  uint32_t rebase_off;
866  uint32_t rebase_size;
867  uint32_t bind_off;
868  uint32_t bind_size;
869  uint32_t weak_bind_off;
870  uint32_t weak_bind_size;
871  uint32_t lazy_bind_off;
872  uint32_t lazy_bind_size;
873  uint32_t export_off;
874  uint32_t export_size;
875  };
876 
878  uint32_t cmd;
879  uint32_t cmdsize;
880  uint32_t count;
881  };
882 
883  struct symseg_command {
884  uint32_t cmd;
885  uint32_t cmdsize;
886  uint32_t offset;
887  uint32_t size;
888  };
889 
890  struct ident_command {
891  uint32_t cmd;
892  uint32_t cmdsize;
893  };
894 
896  uint32_t cmd;
897  uint32_t cmdsize;
898  uint32_t name;
899  uint32_t header_addr;
900  };
901 
903  uint32_t thunk;
904  uint32_t key;
905  uint32_t offset;
906  };
907 
909  uint64_t thunk;
910  uint64_t key;
911  uint64_t offset;
912  };
913 
914  struct tlv_descriptor {
915  uintptr_t thunk;
916  uintptr_t key;
917  uintptr_t offset;
918  };
919 
921  uint32_t cmd;
922  uint32_t cmdsize;
923  uint64_t entryoff;
924  uint64_t stacksize;
925  };
926 
927 
928  // Structs from <mach-o/fat.h>
929  struct fat_header {
930  uint32_t magic;
931  uint32_t nfat_arch;
932  };
933 
934  struct fat_arch {
935  uint32_t cputype;
936  uint32_t cpusubtype;
937  uint32_t offset;
938  uint32_t size;
939  uint32_t align;
940  };
941 
942  // Structs from <mach-o/reloc.h>
944  int32_t r_address;
945  uint32_t r_symbolnum:24,
946  r_pcrel:1,
947  r_length:2,
948  r_extern:1,
949  r_type:4;
950  };
951 
953 #if defined(BYTE_ORDER) && defined(BIG_ENDIAN) && (BYTE_ORDER == BIG_ENDIAN)
954  uint32_t r_scattered:1,
955  r_pcrel:1,
956  r_length:2,
957  r_type:4,
958  r_address:24;
959 #else
960  uint32_t r_address:24,
961  r_type:4,
962  r_length:2,
963  r_pcrel:1,
964  r_scattered:1;
965 #endif
966  int32_t r_value;
967  };
968 
969  // Structs NOT from <mach-o/reloc.h>, but that make LLVM's life easier
971  uint32_t r_word0, r_word1;
972  };
973 
974  // Structs from <mach-o/nlist.h>
975  struct nlist_base {
976  uint32_t n_strx;
977  uint8_t n_type;
978  uint8_t n_sect;
979  uint16_t n_desc;
980  };
981 
982  struct nlist {
983  uint32_t n_strx;
984  uint8_t n_type;
985  uint8_t n_sect;
986  int16_t n_desc;
987  uint32_t n_value;
988  };
989 
990  struct nlist_64 {
991  uint32_t n_strx;
992  uint8_t n_type;
993  uint8_t n_sect;
994  uint16_t n_desc;
995  uint64_t n_value;
996  };
997 
998 
999  // Byte order swapping functions for MachO structs
1000 
1001  inline void swapStruct(mach_header &mh) {
1009  }
1010 
1011  inline void swapStruct(mach_header_64 &H) {
1020  }
1021 
1022  inline void swapStruct(load_command &lc) {
1023  sys::swapByteOrder(lc.cmd);
1025  }
1026 
1027  inline void swapStruct(symtab_command &lc) {
1028  sys::swapByteOrder(lc.cmd);
1034  }
1035 
1036  inline void swapStruct(segment_command_64 &seg) {
1037  sys::swapByteOrder(seg.cmd);
1047  }
1048 
1049  inline void swapStruct(segment_command &seg) {
1050  sys::swapByteOrder(seg.cmd);
1060  }
1061 
1062  inline void swapStruct(section_64 &sect) {
1063  sys::swapByteOrder(sect.addr);
1064  sys::swapByteOrder(sect.size);
1065  sys::swapByteOrder(sect.offset);
1066  sys::swapByteOrder(sect.align);
1067  sys::swapByteOrder(sect.reloff);
1068  sys::swapByteOrder(sect.nreloc);
1069  sys::swapByteOrder(sect.flags);
1072  }
1073 
1074  inline void swapStruct(section &sect) {
1075  sys::swapByteOrder(sect.addr);
1076  sys::swapByteOrder(sect.size);
1077  sys::swapByteOrder(sect.offset);
1078  sys::swapByteOrder(sect.align);
1079  sys::swapByteOrder(sect.reloff);
1080  sys::swapByteOrder(sect.nreloc);
1081  sys::swapByteOrder(sect.flags);
1084  }
1085 
1087  sys::swapByteOrder(info.cmd);
1099  }
1100 
1101  inline void swapStruct(dylib_command &d) {
1108  }
1109 
1114  }
1115 
1120  }
1121 
1126  }
1127 
1128  inline void swapStruct(sub_client_command &s) {
1132  }
1133 
1134  inline void swapStruct(routines_command &r) {
1145  }
1146 
1158  }
1159 
1160  inline void swapStruct(thread_command &t) {
1163  }
1164 
1165  inline void swapStruct(dylinker_command &d) {
1169  }
1170 
1171  inline void swapStruct(uuid_command &u) {
1174  }
1175 
1176  inline void swapStruct(rpath_command &r) {
1180  }
1181 
1186  }
1187 
1193  }
1194 
1201  }
1202 
1210  }
1211 
1212  inline void swapStruct(dysymtab_command &dst) {
1213  sys::swapByteOrder(dst.cmd);
1222  sys::swapByteOrder(dst.ntoc);
1233  }
1234 
1235  inline void swapStruct(any_relocation_info &reloc) {
1236  sys::swapByteOrder(reloc.r_word0);
1237  sys::swapByteOrder(reloc.r_word1);
1238  }
1239 
1240  inline void swapStruct(nlist_base &S) {
1243  }
1244 
1245  inline void swapStruct(nlist &sym) {
1249  }
1250 
1251  inline void swapStruct(nlist_64 &sym) {
1255  }
1256 
1262  }
1263 
1268  }
1269 
1275  }
1276 
1277  inline void swapStruct(data_in_code_entry &C) {
1281  }
1282 
1283  inline void swapStruct(uint32_t &C) {
1284  sys::swapByteOrder(C);
1285  }
1286 
1287  // Get/Set functions from <mach-o/nlist.h>
1288 
1289  static inline uint16_t GET_LIBRARY_ORDINAL(uint16_t n_desc) {
1290  return (((n_desc) >> 8u) & 0xffu);
1291  }
1292 
1293  static inline void SET_LIBRARY_ORDINAL(uint16_t &n_desc, uint8_t ordinal) {
1294  n_desc = (((n_desc) & 0x00ff) | (((ordinal) & 0xff) << 8));
1295  }
1296 
1297  static inline uint8_t GET_COMM_ALIGN (uint16_t n_desc) {
1298  return (n_desc >> 8u) & 0x0fu;
1299  }
1300 
1301  static inline void SET_COMM_ALIGN (uint16_t &n_desc, uint8_t align) {
1302  n_desc = ((n_desc & 0xf0ffu) | ((align & 0x0fu) << 8u));
1303  }
1304 
1305  // Enums from <mach/machine.h>
1306  enum : uint32_t {
1307  // Capability bits used in the definition of cpu_type.
1308  CPU_ARCH_MASK = 0xff000000, // Mask for architecture bits
1309  CPU_ARCH_ABI64 = 0x01000000 // 64 bit ABI
1310  };
1311 
1312  // Constants for the cputype field.
1313  enum CPUType {
1318  /* CPU_TYPE_MIPS = 8, */
1319  CPU_TYPE_MC98000 = 10, // Old Motorola PowerPC
1325  };
1326 
1327  enum : uint32_t {
1328  // Capability bits used in the definition of cpusubtype.
1329  CPU_SUBTYPE_MASK = 0xff000000, // Mask for architecture bits
1330  CPU_SUBTYPE_LIB64 = 0x80000000, // 64 bit libraries
1331 
1332  // Special CPU subtype constants.
1334  };
1335 
1336  // Constants for the cpusubtype field.
1359 
1364  };
1365  static inline int CPU_SUBTYPE_INTEL(int Family, int Model) {
1366  return Family | (Model << 4);
1367  }
1369  return ((int)ST) & 0x0f;
1370  }
1372  return ((int)ST) >> 4;
1373  }
1374  enum {
1377  };
1378 
1387  // unused ARM_V7F = 10,
1393  };
1394 
1397  };
1398 
1401  };
1402 
1417 
1420  };
1421 
1423  uint64_t rax;
1424  uint64_t rbx;
1425  uint64_t rcx;
1426  uint64_t rdx;
1427  uint64_t rdi;
1428  uint64_t rsi;
1429  uint64_t rbp;
1430  uint64_t rsp;
1431  uint64_t r8;
1432  uint64_t r9;
1433  uint64_t r10;
1434  uint64_t r11;
1435  uint64_t r12;
1436  uint64_t r13;
1437  uint64_t r14;
1438  uint64_t r15;
1439  uint64_t rip;
1440  uint64_t rflags;
1441  uint64_t cs;
1442  uint64_t fs;
1443  uint64_t gs;
1444  };
1445 
1450  };
1451 
1457  };
1458 
1459  struct fp_control_t {
1460  unsigned short
1462  denorm :1,
1463  zdiv :1,
1464  ovrfl :1,
1465  undfl :1,
1466  precis :1,
1467  :2,
1468  pc :2,
1469  rc :2,
1470  :1,
1471  :3;
1472  };
1473 
1474  struct fp_status_t {
1475  unsigned short
1477  denorm :1,
1478  zdiv :1,
1479  ovrfl :1,
1480  undfl :1,
1481  precis :1,
1482  stkflt :1,
1483  errsumm :1,
1484  c0 :1,
1485  c1 :1,
1486  c2 :1,
1487  tos :3,
1488  c3 :1,
1489  busy :1;
1490  };
1491 
1492  struct mmst_reg_t {
1493  char mmst_reg[10];
1494  char mmst_rsrv[6];
1495  };
1496 
1497  struct xmm_reg_t {
1498  char xmm_reg[16];
1499  };
1500 
1502  int32_t fpu_reserved[2];
1505  uint8_t fpu_ftw;
1506  uint8_t fpu_rsrv1;
1507  uint16_t fpu_fop;
1508  uint32_t fpu_ip;
1509  uint16_t fpu_cs;
1510  uint16_t fpu_rsrv2;
1511  uint32_t fpu_dp;
1512  uint16_t fpu_ds;
1513  uint16_t fpu_rsrv3;
1514  uint32_t fpu_mxcsr;
1515  uint32_t fpu_mxcsrmask;
1540  char fpu_rsrv4[6*16];
1541  uint32_t fpu_reserved1;
1542  };
1543 
1545  uint16_t trapno;
1546  uint16_t cpu;
1547  uint32_t err;
1548  uint64_t faultvaddr;
1549  };
1550 
1573  }
1574 
1578  // TODO swap: fp_control_t fpu_fcw;
1579  // TODO swap: fp_status_t fpu_fsw;
1590  }
1591 
1597  }
1598 
1600  uint32_t flavor;
1601  uint32_t count;
1602  };
1603 
1606  union {
1608  } uts;
1609  };
1610 
1613  union {
1615  } ufs;
1616  };
1617 
1620  union {
1622  } ues;
1623  };
1624 
1625  inline void swapStruct(x86_state_hdr_t &x) {
1628  }
1629 
1643  };
1644 
1645  inline void swapStruct(x86_thread_state_t &x) {
1646  swapStruct(x.tsh);
1647  if (x.tsh.flavor == x86_THREAD_STATE64)
1648  swapStruct(x.uts.ts64);
1649  }
1650 
1651  inline void swapStruct(x86_float_state_t &x) {
1652  swapStruct(x.fsh);
1653  if (x.fsh.flavor == x86_FLOAT_STATE64)
1654  swapStruct(x.ufs.fs64);
1655  }
1656 
1658  swapStruct(x.esh);
1659  if (x.esh.flavor == x86_EXCEPTION_STATE64)
1660  swapStruct(x.ues.es64);
1661  }
1662 
1663  const uint32_t x86_THREAD_STATE64_COUNT =
1664  sizeof(x86_thread_state64_t) / sizeof(uint32_t);
1665  const uint32_t x86_FLOAT_STATE64_COUNT =
1666  sizeof(x86_float_state64_t) / sizeof(uint32_t);
1668  sizeof(x86_exception_state64_t) / sizeof(uint32_t);
1669 
1670  const uint32_t x86_THREAD_STATE_COUNT =
1671  sizeof(x86_thread_state_t) / sizeof(uint32_t);
1672  const uint32_t x86_FLOAT_STATE_COUNT =
1673  sizeof(x86_float_state_t) / sizeof(uint32_t);
1674  const uint32_t x86_EXCEPTION_STATE_COUNT =
1675  sizeof(x86_exception_state_t) / sizeof(uint32_t);
1676 
1677  } // end namespace MachO
1678 } // end namespace llvm
1679 
1680 #endif
S_NON_LAZY_SYMBOL_POINTERS - Section with non-lazy symbol pointers.
const uint32_t x86_FLOAT_STATE_COUNT
S_SYMBOL_STUBS - Section with symbol stubs, byte size of stub in the Reserved2 field.
union llvm::MachO::x86_exception_state_t::@181 ues
void swapByteOrder(T &Value)
const uint32_t x86_EXCEPTION_STATE64_COUNT
S_ATTR_SOME_INSTRUCTIONS - Section contains some machine instructions.
void swapStruct(mach_header &mh)
union llvm::MachO::x86_float_state_t::@180 ufs
S_THREAD_LOCAL_VARIABLES - Section with thread local variable structure data.
union llvm::MachO::x86_thread_state_t::@179 uts
lazy value info
S_LAZY_DYLIB_SYMBOL_POINTERS - Section with lazy symbol pointers to lazy loaded dylibs.
S_4BYTE_LITERALS - Section with 4 byte literals.
uint16_t length
S_8BYTE_LITERALS - Section with 8 byte literals.
S_MOD_TERM_FUNC_POINTERS - Section with only function pointers for termination.
S_ATTR_EXT_RELOC - Section has external relocation entries.
S_REGULAR - Regular section.
S_INTERPOSING - Section with only pairs of function pointers for interposing.
static void SET_LIBRARY_ORDINAL(uint16_t &n_desc, uint8_t ordinal)
static uint8_t GET_COMM_ALIGN(uint16_t n_desc)
S_ATTR_STRIP_STATIC_SYMS - Ok to strip static symbols in this section in files with the MY_DYLDLINK f...
S_LITERAL_POINTERS - Section with pointers to literals.
S_ATTR_PURE_INSTRUCTIONS - Section contains only true machine instructions.
S_GB_ZEROFILL - Zero fill on demand section (that can be larger than 4 gigabytes).
S_THREAD_LOCAL_ZEROFILL - Thread local zerofill section.
const uint32_t x86_THREAD_STATE64_COUNT
#define H(x, y, z)
Definition: MD5.cpp:53
uint32_t offset
S_THREAD_LOCAL_REGULAR - Thread local data section.
S_CSTRING_LITERALS - Section with literal C strings.
S_ATTR_LIVE_SUPPORT - Blocks are live if they reference live blocks.
static uint16_t GET_LIBRARY_ORDINAL(uint16_t n_desc)
uint16_t kind
x86_exception_state64_t es64
static int CPU_SUBTYPE_INTEL(int Family, int Model)
S_LAZY_SYMBOL_POINTERS - Section with lazy symbol pointers.
S_ATTR_NO_DEAD_STRIP - No dead stripping.
S_DTRACE_DOF - Section contains DTrace Object Format.
static void SET_COMM_ALIGN(uint16_t &n_desc, uint8_t align)
const uint32_t x86_FLOAT_STATE64_COUNT
S_THREAD_LOCAL_VARIABLE_POINTERS - Section with pointers to thread local structures.
const uint32_t x86_THREAD_STATE_COUNT
S_THREAD_LOCAL_INIT_FUNCTION_POINTERS - Section with thread local variable initialization pointers to...
S_16BYTE_LITERALS - Section with only 16 byte literals.
const uint32_t x86_EXCEPTION_STATE_COUNT
S_ATTR_LOC_RELOC - Section has local relocation entries.
S_ATTR_DEBUG - A debug section.
S_ATTR_SELF_MODIFYING_CODE - Used with i386 code stubs written on by dyld.
static int CPU_SUBTYPE_INTEL_MODEL(CPUSubTypeX86 ST)
static int CPU_SUBTYPE_INTEL_FAMILY(CPUSubTypeX86 ST)
S_COALESCED - Section contains symbols that are to be coalesced.
S_ZEROFILL - Zero fill on demand section.
S_MOD_INIT_FUNC_POINTERS - Section with only function pointers for initialization.
SectionType
These are the section type and attributes fields.
uint32_t current_version
S_ATTR_NO_TOC - Section contains coalesced symbols that are not to be in a ranlib table of contents...
uint32_t compatibility_version