ruby-macho 0.2.4 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +8 -9
- data/lib/macho.rb +2 -1
- data/lib/macho/exceptions.rb +83 -6
- data/lib/macho/fat_file.rb +130 -39
- data/lib/macho/headers.rb +131 -25
- data/lib/macho/load_commands.rb +518 -177
- data/lib/macho/macho_file.rb +254 -172
- data/lib/macho/open.rb +5 -5
- data/lib/macho/sections.rb +20 -9
- data/lib/macho/structure.rb +8 -16
- data/lib/macho/tools.rb +34 -15
- data/lib/macho/utils.rb +87 -39
- data/lib/macho/view.rb +23 -0
- metadata +4 -2
data/lib/macho/headers.rb
CHANGED
@@ -1,64 +1,82 @@
|
|
1
1
|
module MachO
|
2
2
|
# big-endian fat magic
|
3
|
+
# @api private
|
3
4
|
FAT_MAGIC = 0xcafebabe
|
4
5
|
|
5
6
|
# little-endian fat magic
|
6
7
|
# this is defined, but should never appear in ruby-macho code because
|
7
8
|
# fat headers are always big-endian and therefore always unpacked as such.
|
9
|
+
# @api private
|
8
10
|
FAT_CIGAM = 0xbebafeca
|
9
11
|
|
10
12
|
# 32-bit big-endian magic
|
13
|
+
# @api private
|
11
14
|
MH_MAGIC = 0xfeedface
|
12
15
|
|
13
16
|
# 32-bit little-endian magic
|
17
|
+
# @api private
|
14
18
|
MH_CIGAM = 0xcefaedfe
|
15
19
|
|
16
20
|
# 64-bit big-endian magic
|
21
|
+
# @api private
|
17
22
|
MH_MAGIC_64 = 0xfeedfacf
|
18
23
|
|
19
24
|
# 64-bit little-endian magic
|
25
|
+
# @api private
|
20
26
|
MH_CIGAM_64 = 0xcffaedfe
|
21
27
|
|
22
28
|
# association of magic numbers to string representations
|
29
|
+
# @api private
|
23
30
|
MH_MAGICS = {
|
24
31
|
FAT_MAGIC => "FAT_MAGIC",
|
25
32
|
MH_MAGIC => "MH_MAGIC",
|
26
33
|
MH_CIGAM => "MH_CIGAM",
|
27
34
|
MH_MAGIC_64 => "MH_MAGIC_64",
|
28
|
-
MH_CIGAM_64 => "MH_CIGAM_64"
|
29
|
-
}
|
35
|
+
MH_CIGAM_64 => "MH_CIGAM_64",
|
36
|
+
}.freeze
|
30
37
|
|
31
38
|
# mask for CPUs with 64-bit architectures (when running a 64-bit ABI?)
|
39
|
+
# @api private
|
32
40
|
CPU_ARCH_ABI64 = 0x01000000
|
33
41
|
|
34
42
|
# any CPU (unused?)
|
43
|
+
# @api private
|
35
44
|
CPU_TYPE_ANY = -1
|
36
45
|
|
37
46
|
# m68k compatible CPUs
|
47
|
+
# @api private
|
38
48
|
CPU_TYPE_MC680X0 = 0x06
|
39
49
|
|
40
50
|
# i386 and later compatible CPUs
|
51
|
+
# @api private
|
41
52
|
CPU_TYPE_I386 = 0x07
|
42
53
|
|
43
54
|
# x86_64 (AMD64) compatible CPUs
|
55
|
+
# @api private
|
44
56
|
CPU_TYPE_X86_64 = (CPU_TYPE_I386 | CPU_ARCH_ABI64)
|
45
57
|
|
46
58
|
# 32-bit ARM compatible CPUs
|
59
|
+
# @api private
|
47
60
|
CPU_TYPE_ARM = 0x0c
|
48
61
|
|
49
62
|
# m88k compatible CPUs
|
63
|
+
# @api private
|
50
64
|
CPU_TYPE_MC88000 = 0xd
|
51
65
|
|
52
66
|
# 64-bit ARM compatible CPUs
|
67
|
+
# @api private
|
53
68
|
CPU_TYPE_ARM64 = (CPU_TYPE_ARM | CPU_ARCH_ABI64)
|
54
69
|
|
55
70
|
# PowerPC compatible CPUs
|
71
|
+
# @api private
|
56
72
|
CPU_TYPE_POWERPC = 0x12
|
57
73
|
|
58
74
|
# PowerPC64 compatible CPUs
|
75
|
+
# @api private
|
59
76
|
CPU_TYPE_POWERPC64 = (CPU_TYPE_POWERPC | CPU_ARCH_ABI64)
|
60
77
|
|
61
78
|
# association of cpu types to symbol representations
|
79
|
+
# @api private
|
62
80
|
CPU_TYPES = {
|
63
81
|
CPU_TYPE_ANY => :any,
|
64
82
|
CPU_TYPE_I386 => :i386,
|
@@ -67,156 +85,213 @@ module MachO
|
|
67
85
|
CPU_TYPE_ARM64 => :arm64,
|
68
86
|
CPU_TYPE_POWERPC => :ppc,
|
69
87
|
CPU_TYPE_POWERPC64 => :ppc64,
|
70
|
-
}
|
88
|
+
}.freeze
|
71
89
|
|
72
90
|
# mask for CPU subtype capabilities
|
91
|
+
# @api private
|
73
92
|
CPU_SUBTYPE_MASK = 0xff000000
|
74
93
|
|
75
94
|
# 64-bit libraries (undocumented!)
|
76
95
|
# @see http://llvm.org/docs/doxygen/html/Support_2MachO_8h_source.html
|
96
|
+
# @api private
|
77
97
|
CPU_SUBTYPE_LIB64 = 0x80000000
|
78
98
|
|
79
99
|
# the lowest common sub-type for `CPU_TYPE_I386`
|
100
|
+
# @api private
|
80
101
|
CPU_SUBTYPE_I386 = 3
|
81
102
|
|
82
103
|
# the i486 sub-type for `CPU_TYPE_I386`
|
104
|
+
# @api private
|
83
105
|
CPU_SUBTYPE_486 = 4
|
84
106
|
|
85
107
|
# the i486SX sub-type for `CPU_TYPE_I386`
|
108
|
+
# @api private
|
86
109
|
CPU_SUBTYPE_486SX = 132
|
87
110
|
|
88
111
|
# the i586 (P5, Pentium) sub-type for `CPU_TYPE_I386`
|
112
|
+
# @api private
|
89
113
|
CPU_SUBTYPE_586 = 5
|
90
|
-
|
114
|
+
|
115
|
+
# @see CPU_SUBTYPE_586
|
116
|
+
# @api private
|
117
|
+
CPU_SUBTYPE_PENT = CPU_SUBTYPE_586
|
91
118
|
|
92
119
|
# the Pentium Pro (P6) sub-type for `CPU_TYPE_I386`
|
120
|
+
# @api private
|
93
121
|
CPU_SUBTYPE_PENTPRO = 22
|
94
122
|
|
95
123
|
# the Pentium II (P6, M3?) sub-type for `CPU_TYPE_I386`
|
124
|
+
# @api private
|
96
125
|
CPU_SUBTYPE_PENTII_M3 = 54
|
97
126
|
|
98
127
|
# the Pentium II (P6, M5?) sub-type for `CPU_TYPE_I386`
|
128
|
+
# @api private
|
99
129
|
CPU_SUBTYPE_PENTII_M5 = 86
|
100
130
|
|
101
131
|
# the Pentium 4 (Netburst) sub-type for `CPU_TYPE_I386`
|
132
|
+
# @api private
|
102
133
|
CPU_SUBTYPE_PENTIUM_4 = 10
|
103
134
|
|
104
135
|
# the lowest common sub-type for `CPU_TYPE_MC680X0`
|
136
|
+
# @api private
|
105
137
|
CPU_SUBTYPE_MC680X0_ALL = 1
|
138
|
+
|
139
|
+
# @see CPU_SUBTYPE_MC680X0_ALL
|
140
|
+
# @api private
|
106
141
|
CPU_SUBTYPE_MC68030 = CPU_SUBTYPE_MC680X0_ALL
|
107
142
|
|
108
143
|
# the 040 subtype for `CPU_TYPE_MC680X0`
|
144
|
+
# @api private
|
109
145
|
CPU_SUBTYPE_MC68040 = 2
|
110
146
|
|
111
147
|
# the 030 subtype for `CPU_TYPE_MC680X0`
|
148
|
+
# @api private
|
112
149
|
CPU_SUBTYPE_MC68030_ONLY = 3
|
113
150
|
|
114
151
|
# the lowest common sub-type for `CPU_TYPE_X86_64`
|
152
|
+
# @api private
|
115
153
|
CPU_SUBTYPE_X86_64_ALL = CPU_SUBTYPE_I386
|
116
154
|
|
117
155
|
# the Haskell sub-type for `CPU_TYPE_X86_64`
|
156
|
+
# @api private
|
118
157
|
CPU_SUBTYPE_X86_64_H = 8
|
119
158
|
|
120
159
|
# the lowest common sub-type for `CPU_TYPE_ARM`
|
160
|
+
# @api private
|
121
161
|
CPU_SUBTYPE_ARM_ALL = 0
|
122
162
|
|
123
163
|
# the v4t sub-type for `CPU_TYPE_ARM`
|
164
|
+
# @api private
|
124
165
|
CPU_SUBTYPE_ARM_V4T = 5
|
125
166
|
|
126
167
|
# the v6 sub-type for `CPU_TYPE_ARM`
|
168
|
+
# @api private
|
127
169
|
CPU_SUBTYPE_ARM_V6 = 6
|
128
170
|
|
129
171
|
# the v5 sub-type for `CPU_TYPE_ARM`
|
172
|
+
# @api private
|
130
173
|
CPU_SUBTYPE_ARM_V5TEJ = 7
|
131
174
|
|
132
175
|
# the xscale (v5 family) sub-type for `CPU_TYPE_ARM`
|
176
|
+
# @api private
|
133
177
|
CPU_SUBTYPE_ARM_XSCALE = 8
|
134
178
|
|
135
179
|
# the v7 sub-type for `CPU_TYPE_ARM`
|
180
|
+
# @api private
|
136
181
|
CPU_SUBTYPE_ARM_V7 = 9
|
137
182
|
|
138
183
|
# the v7f (Cortex A9) sub-type for `CPU_TYPE_ARM`
|
184
|
+
# @api private
|
139
185
|
CPU_SUBTYPE_ARM_V7F = 10
|
140
186
|
|
141
187
|
# the v7s ("Swift") sub-type for `CPU_TYPE_ARM`
|
188
|
+
# @api private
|
142
189
|
CPU_SUBTYPE_ARM_V7S = 11
|
143
190
|
|
144
191
|
# the v7k ("Kirkwood40") sub-type for `CPU_TYPE_ARM`
|
192
|
+
# @api private
|
145
193
|
CPU_SUBTYPE_ARM_V7K = 12
|
146
194
|
|
147
195
|
# the v6m sub-type for `CPU_TYPE_ARM`
|
196
|
+
# @api private
|
148
197
|
CPU_SUBTYPE_ARM_V6M = 14
|
149
198
|
|
150
199
|
# the v7m sub-type for `CPU_TYPE_ARM`
|
200
|
+
# @api private
|
151
201
|
CPU_SUBTYPE_ARM_V7M = 15
|
152
202
|
|
153
203
|
# the v7em sub-type for `CPU_TYPE_ARM`
|
204
|
+
# @api private
|
154
205
|
CPU_SUBTYPE_ARM_V7EM = 16
|
155
206
|
|
156
207
|
# the v8 sub-type for `CPU_TYPE_ARM`
|
208
|
+
# @api private
|
157
209
|
CPU_SUBTYPE_ARM_V8 = 13
|
158
210
|
|
159
211
|
# the lowest common sub-type for `CPU_TYPE_ARM64`
|
212
|
+
# @api private
|
160
213
|
CPU_SUBTYPE_ARM64_ALL = 0
|
161
214
|
|
162
215
|
# the v8 sub-type for `CPU_TYPE_ARM64`
|
216
|
+
# @api private
|
163
217
|
CPU_SUBTYPE_ARM64_V8 = 1
|
164
218
|
|
165
219
|
# the lowest common sub-type for `CPU_TYPE_MC88000`
|
220
|
+
# @api private
|
166
221
|
CPU_SUBTYPE_MC88000_ALL = 0
|
222
|
+
|
223
|
+
# @see CPU_SUBTYPE_MC88000_ALL
|
224
|
+
# @api private
|
167
225
|
CPU_SUBTYPE_MMAX_JPC = CPU_SUBTYPE_MC88000_ALL
|
168
226
|
|
169
227
|
# the 100 sub-type for `CPU_TYPE_MC88000`
|
228
|
+
# @api private
|
170
229
|
CPU_SUBTYPE_MC88100 = 1
|
171
230
|
|
172
231
|
# the 110 sub-type for `CPU_TYPE_MC88000`
|
232
|
+
# @api private
|
173
233
|
CPU_SUBTYPE_MC88110 = 2
|
174
234
|
|
175
235
|
# the lowest common sub-type for `CPU_TYPE_POWERPC`
|
236
|
+
# @api private
|
176
237
|
CPU_SUBTYPE_POWERPC_ALL = 0
|
177
238
|
|
178
239
|
# the 601 sub-type for `CPU_TYPE_POWERPC`
|
240
|
+
# @api private
|
179
241
|
CPU_SUBTYPE_POWERPC_601 = 1
|
180
242
|
|
181
243
|
# the 602 sub-type for `CPU_TYPE_POWERPC`
|
244
|
+
# @api private
|
182
245
|
CPU_SUBTYPE_POWERPC_602 = 2
|
183
246
|
|
184
247
|
# the 603 sub-type for `CPU_TYPE_POWERPC`
|
248
|
+
# @api private
|
185
249
|
CPU_SUBTYPE_POWERPC_603 = 3
|
186
250
|
|
187
251
|
# the 603e (G2) sub-type for `CPU_TYPE_POWERPC`
|
252
|
+
# @api private
|
188
253
|
CPU_SUBTYPE_POWERPC_603E = 4
|
189
254
|
|
190
255
|
# the 603ev sub-type for `CPU_TYPE_POWERPC`
|
256
|
+
# @api private
|
191
257
|
CPU_SUBTYPE_POWERPC_603EV = 5
|
192
258
|
|
193
259
|
# the 604 sub-type for `CPU_TYPE_POWERPC`
|
260
|
+
# @api private
|
194
261
|
CPU_SUBTYPE_POWERPC_604 = 6
|
195
262
|
|
196
263
|
# the 604e sub-type for `CPU_TYPE_POWERPC`
|
264
|
+
# @api private
|
197
265
|
CPU_SUBTYPE_POWERPC_604E = 7
|
198
266
|
|
199
267
|
# the 620 sub-type for `CPU_TYPE_POWERPC`
|
268
|
+
# @api private
|
200
269
|
CPU_SUBTYPE_POWERPC_620 = 8
|
201
270
|
|
202
271
|
# the 750 (G3) sub-type for `CPU_TYPE_POWERPC`
|
272
|
+
# @api private
|
203
273
|
CPU_SUBTYPE_POWERPC_750 = 9
|
204
274
|
|
205
275
|
# the 7400 (G4) sub-type for `CPU_TYPE_POWERPC`
|
276
|
+
# @api private
|
206
277
|
CPU_SUBTYPE_POWERPC_7400 = 10
|
207
278
|
|
208
279
|
# the 7450 (G4 "Voyager") sub-type for `CPU_TYPE_POWERPC`
|
280
|
+
# @api private
|
209
281
|
CPU_SUBTYPE_POWERPC_7450 = 11
|
210
282
|
|
211
283
|
# the 970 (G5) sub-type for `CPU_TYPE_POWERPC`
|
284
|
+
# @api private
|
212
285
|
CPU_SUBTYPE_POWERPC_970 = 100
|
213
286
|
|
214
287
|
# any CPU sub-type for CPU type `CPU_TYPE_POWERPC64`
|
288
|
+
# @api private
|
215
289
|
CPU_SUBTYPE_POWERPC64_ALL = CPU_SUBTYPE_POWERPC_ALL
|
216
290
|
|
217
291
|
# association of CPU types/subtype pairs to symbol representations in
|
218
292
|
# (very) roughly descending order of commonness
|
219
293
|
# @see https://opensource.apple.com/source/cctools/cctools-877.8/libstuff/arch.c
|
294
|
+
# @api private
|
220
295
|
CPU_SUBTYPES = {
|
221
296
|
CPU_TYPE_I386 => {
|
222
297
|
CPU_SUBTYPE_I386 => :i386,
|
@@ -280,53 +355,64 @@ module MachO
|
|
280
355
|
}.freeze
|
281
356
|
|
282
357
|
# relocatable object file
|
358
|
+
# @api private
|
283
359
|
MH_OBJECT = 0x1
|
284
360
|
|
285
361
|
# demand paged executable file
|
362
|
+
# @api private
|
286
363
|
MH_EXECUTE = 0x2
|
287
364
|
|
288
365
|
# fixed VM shared library file
|
366
|
+
# @api private
|
289
367
|
MH_FVMLIB = 0x3
|
290
368
|
|
291
369
|
# core dump file
|
370
|
+
# @api private
|
292
371
|
MH_CORE = 0x4
|
293
372
|
|
294
373
|
# preloaded executable file
|
374
|
+
# @api private
|
295
375
|
MH_PRELOAD = 0x5
|
296
376
|
|
297
377
|
# dynamically bound shared library
|
378
|
+
# @api private
|
298
379
|
MH_DYLIB = 0x6
|
299
380
|
|
300
381
|
# dynamic link editor
|
382
|
+
# @api private
|
301
383
|
MH_DYLINKER = 0x7
|
302
384
|
|
303
385
|
# dynamically bound bundle file
|
386
|
+
# @api private
|
304
387
|
MH_BUNDLE = 0x8
|
305
388
|
|
306
389
|
# shared library stub for static linking only, no section contents
|
390
|
+
# @api private
|
307
391
|
MH_DYLIB_STUB = 0x9
|
308
392
|
|
309
393
|
# companion file with only debug sections
|
394
|
+
# @api private
|
310
395
|
MH_DSYM = 0xa
|
311
396
|
|
312
397
|
# x86_64 kexts
|
398
|
+
# @api private
|
313
399
|
MH_KEXT_BUNDLE = 0xb
|
314
400
|
|
315
|
-
# association of filetypes to
|
401
|
+
# association of filetypes to Symbol representations
|
316
402
|
# @api private
|
317
403
|
MH_FILETYPES = {
|
318
|
-
MH_OBJECT =>
|
319
|
-
MH_EXECUTE =>
|
320
|
-
MH_FVMLIB =>
|
321
|
-
MH_CORE =>
|
322
|
-
MH_PRELOAD =>
|
323
|
-
MH_DYLIB =>
|
324
|
-
MH_DYLINKER =>
|
325
|
-
MH_BUNDLE =>
|
326
|
-
MH_DYLIB_STUB =>
|
327
|
-
MH_DSYM =>
|
328
|
-
MH_KEXT_BUNDLE =>
|
329
|
-
}
|
404
|
+
MH_OBJECT => :object,
|
405
|
+
MH_EXECUTE => :execute,
|
406
|
+
MH_FVMLIB => :fvmlib,
|
407
|
+
MH_CORE => :core,
|
408
|
+
MH_PRELOAD => :preload,
|
409
|
+
MH_DYLIB => :dylib,
|
410
|
+
MH_DYLINKER => :dylinker,
|
411
|
+
MH_BUNDLE => :bundle,
|
412
|
+
MH_DYLIB_STUB => :dylib_stub,
|
413
|
+
MH_DSYM => :dsym,
|
414
|
+
MH_KEXT_BUNDLE => :kext_bundle,
|
415
|
+
}.freeze
|
330
416
|
|
331
417
|
# association of mach header flag symbols to values
|
332
418
|
# @api private
|
@@ -356,8 +442,8 @@ module MachO
|
|
356
442
|
:MH_DEAD_STRIPPABLE_DYLIB => 0x400000,
|
357
443
|
:MH_HAS_TLV_DESCRIPTORS => 0x800000,
|
358
444
|
:MH_NO_HEAP_EXECUTION => 0x1000000,
|
359
|
-
:MH_APP_EXTENSION_SAFE => 0x02000000
|
360
|
-
}
|
445
|
+
:MH_APP_EXTENSION_SAFE => 0x02000000,
|
446
|
+
}.freeze
|
361
447
|
|
362
448
|
# Fat binary header structure
|
363
449
|
# @see MachO::FatArch
|
@@ -369,7 +455,12 @@ module MachO
|
|
369
455
|
attr_reader :nfat_arch
|
370
456
|
|
371
457
|
# always big-endian
|
372
|
-
|
458
|
+
# @see MachOStructure::FORMAT
|
459
|
+
# @api private
|
460
|
+
FORMAT = "N2".freeze
|
461
|
+
|
462
|
+
# @see MachOStructure::SIZEOF
|
463
|
+
# @api private
|
373
464
|
SIZEOF = 8
|
374
465
|
|
375
466
|
# @api private
|
@@ -399,7 +490,12 @@ module MachO
|
|
399
490
|
attr_reader :align
|
400
491
|
|
401
492
|
# always big-endian
|
402
|
-
|
493
|
+
# @see MachOStructure::FORMAT
|
494
|
+
# @api private
|
495
|
+
FORMAT = "N5".freeze
|
496
|
+
|
497
|
+
# @see MachOStructure::SIZEOF
|
498
|
+
# @api private
|
403
499
|
SIZEOF = 20
|
404
500
|
|
405
501
|
# @api private
|
@@ -435,12 +531,17 @@ module MachO
|
|
435
531
|
# @return [Fixnum] the header flags associated with the Mach-O
|
436
532
|
attr_reader :flags
|
437
533
|
|
438
|
-
|
534
|
+
# @see MachOStructure::FORMAT
|
535
|
+
# @api private
|
536
|
+
FORMAT = "L=7".freeze
|
537
|
+
|
538
|
+
# @see MachOStructure::SIZEOF
|
539
|
+
# @api private
|
439
540
|
SIZEOF = 28
|
440
541
|
|
441
542
|
# @api private
|
442
543
|
def initialize(magic, cputype, cpusubtype, filetype, ncmds, sizeofcmds,
|
443
|
-
|
544
|
+
flags)
|
444
545
|
@magic = magic
|
445
546
|
@cputype = cputype
|
446
547
|
# For now we're not interested in additional capability bits also to be
|
@@ -468,12 +569,17 @@ module MachO
|
|
468
569
|
# @return [void]
|
469
570
|
attr_reader :reserved
|
470
571
|
|
471
|
-
|
572
|
+
# @see MachOStructure::FORMAT
|
573
|
+
# @api private
|
574
|
+
FORMAT = "L=8".freeze
|
575
|
+
|
576
|
+
# @see MachOStructure::SIZEOF
|
577
|
+
# @api private
|
472
578
|
SIZEOF = 32
|
473
579
|
|
474
580
|
# @api private
|
475
581
|
def initialize(magic, cputype, cpusubtype, filetype, ncmds, sizeofcmds,
|
476
|
-
|
582
|
+
flags, reserved)
|
477
583
|
super(magic, cputype, cpusubtype, filetype, ncmds, sizeofcmds, flags)
|
478
584
|
@reserved = reserved
|
479
585
|
end
|