summaryrefslogtreecommitdiff
path: root/fpcsrc/packages/fcl-res/src/machoconsts.pp
blob: 7c99421c82ca59a7a26482123f1af714eb75055c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
{
    This file is part of the Free Pascal run time library.
    Copyright (c) 2008 by Giulio Bernardi

    Constants used by Mach-O resource reader and writer

    See the file COPYING.FPC, included in this distribution,
    for details about the copyright.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 **********************************************************************}

unit machoconsts;

{$MODE OBJFPC}

interface

uses
  machotypes;

const
  DataSegName     : TSegSectName = '__DATA'+#0+#0+#0+#0+#0+#0+#0+#0+#0+#0;
  RsrcSectName    : TSegSectName = 'fpc.resources'+#0+#0+#0;
  HandlesSectName : TSegSectName = 'fpc.reshandles'+#0+#0;
  
  //private constants used by reader and writer only, not apple-defined
  MACH_BIG_ENDIAN = 1;
  MACH_LITTLE_ENDIAN = 2;

  MACH_ERRBIT = 0;
  MACH_32BIT = 1;
  MACH_64BIT = 2;
  //end of private constants

  //Mach-O magic numbers
  MH_MAGIC    = $FEEDFACE;
  MH_MAGIC_64 = $FEEDFACF;
  MH_CIGAM    = $CEFAEDFE;
  MH_CIGAM_64 = $CFFAEDFE;

  //Cpu types
  CPU_ARCH_ABI64     = $1000000;
  CPU_TYPE_ANY       = -1;
  CPU_TYPE_I386      = 7;
  CPU_TYPE_X86_64    = CPU_TYPE_I386 or CPU_ARCH_ABI64;
  CPU_TYPE_ARM       = 12;
  CPU_TYPE_POWERPC   = 18;
  CPU_TYPE_POWERPC64 = CPU_TYPE_POWERPC or CPU_ARCH_ABI64;

  //Cpu subtypes
  CPU_SUBTYPE_I386_ALL    = 3;
  CPU_SUBTYPE_X86_64_ALL  = CPU_SUBTYPE_I386_ALL;
  CPU_SUBTYPE_POWERPC_ALL = 0;
  CPU_SUBTYPE_ARM_ALL     = 0;
  CPU_SUBTYPE_ARM_V4T     = 5;
  CPU_SUBTYPE_ARM_V6      = 6;
  CPU_SUBTYPE_ARM_V5TEJ   = 7;
  CPU_SUBTYPE_ARM_XSCALE  = 8;
  CPU_SUBTYPE_ARM_V7      = 9;

  //Mach-O object types
  MH_OBJECT      = $1;            // relocatable object file
  MH_EXECUTE     = $2;            // demand paged executable file
  MH_FVMLIB      = $3;            // fixed VM shared library file
  MH_CORE        = $4;            // core file
  MH_PRELOAD     = $5;            // preloaded executable file
  MH_DYLIB       = $6;            // dynamically bound shared library
  MH_DYLINKER    = $7;            // dynamic link editor
  MH_BUNDLE      = $8;            // dynamically bound bundle file
  MH_DYLIB_STUB  = $9;            // shared library stub for static
                                  //  linking only, no section contents
  //Mach-O object flags

  MH_NOUNDEFS                = $00001;
  MH_INCRLINK                = $00002;
  MH_DYLDLINK                = $00004;
  MH_BINDATLOAD              = $00008;
  MH_PREBOUND                = $00010;
  MH_SPLIT_SEGS              = $00020;
  MH_TWOLEVEL                = $00080;
  MH_FORCE_FLAT              = $00100;
  MH_NOMULTIDEFS             = $00200;
  MH_NOFIXPREBINDING         = $00400;
  MH_PREBINDABLE             = $00800;
  MH_ALLMODSBOUND            = $01000;
  MH_SUBSECTIONS_VIA_SYMBOLS = $02000;
  MH_CANONICAL               = $04000;
  MH_WEAK_DEFINES            = $08000;
  MH_BINDS_TO_WEAK           = $10000;

  //Load commands

  LC_SEGMENT        = $1;    // segment of this file to be mapped
  LC_SYMTAB         = $2;    // link-edit stab symbol table info
  LC_SYMSEG         = $3;    // link-edit gdb symbol table info (obsolete)
  LC_THREAD         = $4;    // thread
  LC_UNIXTHREAD     = $5;    // unix thread (includes a stack)
  LC_LOADFVMLIB     = $6;    // load a specified fixed VM shared library
  LC_IDFVMLIB       = $7;    // fixed VM shared library identification
  LC_DYSYMTAB       = $b;    // dynamic link-edit symbol table info
  LC_LOAD_DYLIB     = $c;    // load a dynamically linked shared library
  LC_ID_DYLIB       = $d;    // dynamically linked shared lib ident
  LC_LOAD_DYLINKER  = $e;    // load a dynamic linker
  LC_ID_DYLINKER    = $f;    // dynamic linker identification
  LC_PREBOUND_DYLIB = $10;   // modules prebound for a dynamically
                             //  linked shared library
  LC_ROUTINES       = $11;   // image routines
  LC_SUB_FRAMEWORK  = $12;   // sub framework
  LC_SUB_UMBRELLA   = $13;   // sub umbrella
  LC_SUB_CLIENT     = $14;   // sub client
  LC_SUB_LIBRARY    = $15;   // sub library
  LC_TWOLEVEL_HINTS = $16;   // two-level namespace lookup hints
  LC_PREBIND_CKSUM  = $17;   // prebind checksum
  LC_LOAD_WEAK_DYLIB= $80000018;
  LC_SEGMENT_64     = $19;   // 64-bit segment of this file to be mapped
  LC_ROUTINES_64    = $1a;   // 64-bit image routines
  LC_UUID           = $1b;   // the uuid
  
  //Segment: virtual memory protection
  VM_PROT_NONE       = $00;
  VM_PROT_READ       = $01;                // read permission
  VM_PROT_WRITE      = $02;                // write permission
  VM_PROT_EXECUTE    = $04;                // execute permission
  VM_PROT_DEFAULT    = VM_PROT_READ or VM_PROT_WRITE;
  VM_PROT_ALL        = VM_PROT_READ or VM_PROT_WRITE or VM_PROT_EXECUTE;
  VM_PROT_NO_CHANGE  = $08;
  VM_PROT_COPY       = $10;
  VM_PROT_WANTS_COPY = $10;
  
  //Segment flags
  SG_HIGHVM  = $01;
  SG_FVMLIB  = $02;
  SG_NORELOC = $04;
  
  //Section type and attributes masks
  SECTION_TYPE       = $000000ff;    // 256 section types
  SECTION_ATTRIBUTES = $ffffff00;    //  24 section attributes

  //Section types
  S_REGULAR                  = $0;
  S_ZEROFILL                 = $1;
  S_CSTRING_LITERALS         = $2;
  S_4BYTE_LITERALS           = $3;
  S_8BYTE_LITERALS           = $4;
  S_LITERAL_POINTERS         = $5;
  S_NON_LAZY_SYMBOL_POINTERS = $6;
  S_LAZY_SYMBOL_POINTERS     = $7;
  S_SYMBOL_STUBS             = $8;
  S_MOD_INIT_FUNC_POINTERS   = $9;
  S_MOD_TERM_FUNC_POINTERS   = $a;
  S_COALESCED                = $b;
  S_GB_ZEROFILL              = $c;
  S_INTERPOSING              = $d;

  //Section attributes
  SECTION_ATTRIBUTES_USR   = $ff000000;
  S_ATTR_PURE_INSTRUCTIONS = $80000000;
  S_ATTR_NO_TOC            = $40000000;
  S_ATTR_STRIP_STATIC_SYMS = $20000000;
  S_ATTR_NO_DEAD_STRIP     = $10000000;
  S_ATTR_LIVE_SUPPORT      = $08000000;
  SECTION_ATTRIBUTES_SYS   = $00ffff00;
  S_ATTR_SOME_INSTRUCTIONS = $00000400;
  S_ATTR_EXT_RELOC         = $00000200;
  S_ATTR_LOC_RELOC         = $00000100;

  //Symbols: masks for type
  N_STAB = $e0;  // if any of these bits set, a symbolic debugging entry
  N_PEXT = $10;  // private external symbol bit
  N_TYPE = $0e;  // mask for the type bits
  N_EXT  = $01;  // external symbol bit, set for external symbols

  //values for type in the N_TYPE bits
  N_UNDF = $0;             // undefined, n_sect == NO_SECT
  N_ABS  = $2;             // absolute, n_sect == NO_SECT
  N_SECT = $e;             // defined in section number n_sect
  N_PBUD = $c;             // prebound undefined (defined in a dylib)
  N_INDR = $a;             // indirect
  
  //Relocations: masks for flag
  R_SYMBOLNUM_BE = $FFFFFF00;
  R_PCREL_BE     = $00000080;
  R_LENGTH_BE    = $00000060;
  R_EXTERN_BE    = $00000010;
  R_TYPE_BE      = $0000000F;

  R_SYMBOLNUM_LE = $00FFFFFF;
  R_PCREL_LE     = $01000000;
  R_LENGTH_LE    = $06000000;
  R_EXTERN_LE    = $08000000;
  R_TYPE_LE      = $F0000000;

  //relocation types - powerpc
  PPC_RELOC_VANILLA = 0;      // generic relocation

  //relocation types - i386
  GENERIC_RELOC_VANILLA = 0;  // generic relocation

  //relocation types - x86_64
  X86_64_RELOC_UNSIGNED = 0;  // for absolute addresses

  // relocation types - ARM
  ARM_RELOC_VANILLA = 0; // generic relocation

implementation

end.