]> git.saurik.com Git - apple/ld64.git/blob - src/MachOAbstraction.h
ld64-21.tar.gz
[apple/ld64.git] / src / MachOAbstraction.h
1 /*
2 * Copyright (c) 2005 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23 #include <stdint.h>
24 #include <string.h>
25 #include <mach-o/nlist.h>
26 #include <mach-o/loader.h>
27 #include <libkern/OSByteOrder.h>
28
29
30 #undef ENDIAN_READ16
31 #undef ENDIAN_WRITE16
32 #undef ENDIAN_READ32
33 #undef ENDIAN_WRITE32
34 #undef ENDIAN_SWAP64
35 #undef ENDIAN_SWAP_POINTER
36
37 #if defined(MACHO_32_SAME_ENDIAN) || defined(MACHO_64_SAME_ENDIAN)
38 #define ENDIAN_READ16(x) (x)
39 #define ENDIAN_WRITE16(into, value) into = (value);
40
41 #define ENDIAN_READ32(x) (x)
42 #define ENDIAN_WRITE32(into, value) into = (value);
43
44 #define ENDIAN_SWAP64(x) (x)
45
46 #elif defined(MACHO_32_OPPOSITE_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
47 #define ENDIAN_READ16(x) OSReadSwapInt16((uint16_t*)&(x), 0)
48 #define ENDIAN_WRITE16(into, value) OSWriteSwapInt16(&(into), 0, value);
49
50 #define ENDIAN_READ32(x) OSReadSwapInt32((uint32_t*)&(x), 0)
51 #define ENDIAN_WRITE32(into, value) OSWriteSwapInt32(&(into), 0, value);
52
53 #define ENDIAN_SWAP64(x) OSSwapInt64(x)
54
55 #else
56 #error file format undefined
57 #endif
58
59
60 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
61 typedef uint64_t macho_uintptr_t;
62 typedef int64_t macho_intptr_t;
63 #else
64 typedef uint32_t macho_uintptr_t;
65 typedef int32_t macho_intptr_t;
66 #endif
67
68 #if defined(MACHO_32_SAME_ENDIAN)
69 #define ENDIAN_SWAP_POINTER(x) (x)
70 #elif defined(MACHO_64_SAME_ENDIAN)
71 #define ENDIAN_SWAP_POINTER(x) (x)
72 #elif defined(MACHO_32_OPPOSITE_ENDIAN)
73 #define ENDIAN_SWAP_POINTER(x) OSSwapInt32(x)
74 #elif defined(MACHO_64_OPPOSITE_ENDIAN)
75 #define ENDIAN_SWAP_POINTER(x) OSSwapInt64(x)
76 #else
77 #error file format undefined
78 #endif
79
80
81 #undef mach_header
82 #undef mach_header_64
83 class macho_header {
84 public:
85 uint32_t magic() const;
86 void set_magic(uint32_t);
87
88 cpu_type_t cputype() const;
89 void set_cputype(cpu_type_t);
90
91 cpu_subtype_t cpusubtype() const;
92 void set_cpusubtype(cpu_subtype_t);
93
94 uint32_t filetype() const;
95 void set_filetype(uint32_t);
96
97 uint32_t ncmds() const;
98 void set_ncmds(uint32_t);
99
100 uint32_t sizeofcmds() const;
101 void set_sizeofcmds(uint32_t);
102
103 uint32_t flags() const;
104 void set_flags(uint32_t);
105
106 void set_reserved();
107
108 #if defined(MACHO_64_SAME_ENDIAN)
109 enum { size = sizeof(mach_header_64) };
110 enum { magic_value = MH_MAGIC_64 };
111 #elif defined(MACHO_64_OPPOSITE_ENDIAN)
112 enum { size = sizeof(mach_header_64) };
113 enum { magic_value = MH_MAGIC_64 };
114 #elif defined(MACHO_32_SAME_ENDIAN)
115 enum { size = sizeof(mach_header) };
116 enum { magic_value = MH_MAGIC };
117 #elif defined(MACHO_32_OPPOSITE_ENDIAN)
118 enum { size = sizeof(mach_header) };
119 enum { magic_value = MH_MAGIC };
120 #endif
121
122 private:
123 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
124 struct mach_header_64 content;
125 #else
126 struct mach_header content;
127 #endif
128 };
129 #define mach_header __my_bad
130 #define mach_header_64 __my_bad
131
132 inline __attribute__((always_inline))
133 uint32_t macho_header::magic() const {
134 return ENDIAN_READ32(content.magic);
135 }
136
137 inline __attribute__((always_inline))
138 void macho_header::set_magic(uint32_t _value) {
139 ENDIAN_WRITE32(content.magic, _value);
140 }
141
142 inline __attribute__((always_inline))
143 cpu_type_t macho_header::cputype() const {
144 return ENDIAN_READ32(content.cputype);
145 }
146
147 inline __attribute__((always_inline))
148 void macho_header::set_cputype(cpu_type_t _value) {
149 ENDIAN_WRITE32(content.cputype, _value);
150 }
151
152 inline __attribute__((always_inline))
153 cpu_subtype_t macho_header::cpusubtype() const {
154 return ENDIAN_READ32(content.cpusubtype);
155 }
156
157 inline __attribute__((always_inline))
158 void macho_header::set_cpusubtype(cpu_subtype_t _value) {
159 ENDIAN_WRITE32(content.cpusubtype, _value);
160 }
161
162 inline __attribute__((always_inline))
163 uint32_t macho_header::filetype() const {
164 return ENDIAN_READ32(content.filetype);
165 }
166
167 inline __attribute__((always_inline))
168 void macho_header::set_filetype(uint32_t _value) {
169 ENDIAN_WRITE32(content.filetype, _value);
170 }
171
172 inline __attribute__((always_inline))
173 uint32_t macho_header::ncmds() const {
174 return ENDIAN_READ32(content.ncmds);
175 }
176
177 inline __attribute__((always_inline))
178 void macho_header::set_ncmds(uint32_t _value) {
179 ENDIAN_WRITE32(content.ncmds, _value);
180 }
181
182 inline __attribute__((always_inline))
183 uint32_t macho_header::sizeofcmds() const {
184 return ENDIAN_READ32(content.sizeofcmds);
185 }
186
187 inline __attribute__((always_inline))
188 void macho_header::set_sizeofcmds(uint32_t _value) {
189 ENDIAN_WRITE32(content.sizeofcmds, _value);
190 }
191
192 inline __attribute__((always_inline))
193 uint32_t macho_header::flags() const {
194 return ENDIAN_READ32(content.flags);
195 }
196
197 inline __attribute__((always_inline))
198 void macho_header::set_flags(uint32_t _value) {
199 ENDIAN_WRITE32(content.flags, _value);
200 }
201
202 inline __attribute__((always_inline))
203 void macho_header::set_reserved() {
204 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
205 content.reserved = 0;
206 #endif
207 }
208
209
210 #undef load_command
211 class macho_load_command {
212 public:
213 uint32_t cmd() const;
214 void set_cmd(uint32_t);
215
216 uint32_t cmdsize() const;
217 void set_cmdsize(uint32_t);
218
219 private:
220 struct load_command content;
221 };
222
223 inline __attribute__((always_inline))
224 uint32_t macho_load_command::cmd() const {
225 return ENDIAN_READ32(content.cmd);
226 }
227
228 inline __attribute__((always_inline))
229 void macho_load_command::set_cmd(uint32_t _value) {
230 ENDIAN_WRITE32(content.cmd, _value);
231 }
232
233 inline __attribute__((always_inline))
234 uint32_t macho_load_command::cmdsize() const {
235 return ENDIAN_READ32(content.cmdsize);
236 }
237
238 inline __attribute__((always_inline))
239 void macho_load_command::set_cmdsize(uint32_t _value) {
240 ENDIAN_WRITE32(content.cmdsize, _value);
241 }
242 #define load_command __my_bad
243
244
245 #undef segment_command
246 #undef segment_command_64
247 class macho_segment_command {
248 public:
249 uint32_t cmd() const;
250 void set_cmd(uint32_t);
251
252 uint32_t cmdsize() const;
253 void set_cmdsize(uint32_t);
254
255 const char* segname() const;
256 void set_segname(const char*);
257
258 uint64_t vmaddr() const;
259 void set_vmaddr(uint64_t);
260
261 uint64_t vmsize() const;
262 void set_vmsize(uint64_t);
263
264 uint64_t fileoff() const;
265 void set_fileoff(uint64_t);
266
267 uint64_t filesize() const;
268 void set_filesize(uint64_t);
269
270 vm_prot_t maxprot() const;
271 void set_maxprot(vm_prot_t);
272
273 vm_prot_t initprot() const;
274 void set_initprot(vm_prot_t);
275
276 uint32_t nsects() const;
277 void set_nsects(uint32_t);
278
279 uint32_t flags() const;
280 void set_flags(uint32_t);
281
282 enum { size =
283 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
284 sizeof(segment_command_64) };
285 #else
286 sizeof(segment_command) };
287 #endif
288
289 enum { command =
290 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
291 LC_SEGMENT_64
292 #else
293 LC_SEGMENT
294 #endif
295 };
296
297 private:
298 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
299 struct segment_command_64 content;
300 #else
301 struct segment_command content;
302 #endif
303 };
304 #define segment_command __my_bad
305 #define segment_command_64 __my_bad
306
307 inline __attribute__((always_inline))
308 uint32_t macho_segment_command::cmd() const {
309 return ENDIAN_READ32(content.cmd);
310 }
311
312 inline __attribute__((always_inline))
313 void macho_segment_command::set_cmd(uint32_t _value) {
314 ENDIAN_WRITE32(content.cmd, _value);
315 }
316
317 inline __attribute__((always_inline))
318 uint32_t macho_segment_command::cmdsize() const {
319 return ENDIAN_READ32(content.cmdsize);
320 }
321
322 inline __attribute__((always_inline))
323 void macho_segment_command::set_cmdsize(uint32_t _value) {
324 ENDIAN_WRITE32(content.cmdsize, _value);
325 }
326
327 inline __attribute__((always_inline))
328 const char* macho_segment_command::segname() const {
329 return content.segname;
330 }
331
332 inline __attribute__((always_inline))
333 void macho_segment_command::set_segname(const char* _value) {
334 strncpy(content.segname, _value, 16);
335 }
336
337 inline __attribute__((always_inline))
338 uint64_t macho_segment_command::vmaddr() const {
339 #if defined(ARCH_PPC64)
340 return ENDIAN_SWAP64(content.vmaddr);
341 #elif defined(ARCH_PPC) || defined(ARCH_I386)
342 return ENDIAN_READ32(content.vmaddr);
343 #else
344 #error unknown architecture
345 #endif
346 }
347
348 inline __attribute__((always_inline))
349 void macho_segment_command::set_vmaddr(uint64_t _value) {
350 #if defined(ARCH_PPC64)
351 content.vmaddr = ENDIAN_SWAP64(_value);
352 #elif defined(ARCH_PPC) || defined(ARCH_I386)
353 ENDIAN_WRITE32(content.vmaddr, _value);
354 #else
355 #error unknown architecture
356 #endif
357 }
358
359 inline __attribute__((always_inline))
360 uint64_t macho_segment_command::vmsize() const {
361 #if defined(ARCH_PPC64)
362 return ENDIAN_SWAP64(content.vmsize);
363 #elif defined(ARCH_PPC) || defined(ARCH_I386)
364 return ENDIAN_READ32(content.vmsize);
365 #else
366 #error unknown architecture
367 #endif
368 }
369
370 inline __attribute__((always_inline))
371 void macho_segment_command::set_vmsize(uint64_t _value) {
372 #if defined(ARCH_PPC64)
373 content.vmsize = ENDIAN_SWAP64(_value);
374 #elif defined(ARCH_PPC) || defined(ARCH_I386)
375 ENDIAN_WRITE32(content.vmsize, _value);
376 #else
377 #error unknown architecture
378 #endif
379 }
380
381 inline __attribute__((always_inline))
382 uint64_t macho_segment_command::fileoff() const {
383 #if defined(ARCH_PPC64)
384 return ENDIAN_SWAP64(content.fileoff);
385 #elif defined(ARCH_PPC) || defined(ARCH_I386)
386 return ENDIAN_READ32(content.fileoff);
387 #else
388 #error unknown architecture
389 #endif
390 }
391
392 inline __attribute__((always_inline))
393 void macho_segment_command::set_fileoff(uint64_t _value) {
394 #if defined(ARCH_PPC64)
395 content.fileoff = ENDIAN_SWAP64(_value);
396 #elif defined(ARCH_PPC) || defined(ARCH_I386)
397 ENDIAN_WRITE32(content.fileoff, _value);
398 #else
399 #error unknown architecture
400 #endif
401 }
402
403 inline __attribute__((always_inline))
404 uint64_t macho_segment_command::filesize() const {
405 #if defined(ARCH_PPC64)
406 return ENDIAN_SWAP64(content.filesize);
407 #elif defined(ARCH_PPC) || defined(ARCH_I386)
408 return ENDIAN_READ32(content.filesize);
409 #else
410 #error unknown architecture
411 #endif
412 }
413
414 inline __attribute__((always_inline))
415 void macho_segment_command::set_filesize(uint64_t _value) {
416 #if defined(ARCH_PPC64)
417 content.filesize = ENDIAN_SWAP64(_value);
418 #elif defined(ARCH_PPC) || defined(ARCH_I386)
419 ENDIAN_WRITE32(content.filesize, _value);
420 #else
421 #error unknown architecture
422 #endif
423 }
424
425 inline __attribute__((always_inline))
426 vm_prot_t macho_segment_command::maxprot() const {
427 return ENDIAN_READ32(content.maxprot);
428 }
429
430 inline __attribute__((always_inline))
431 void macho_segment_command::set_maxprot(vm_prot_t _value) {
432 ENDIAN_WRITE32(content.maxprot, _value);
433 }
434
435 inline __attribute__((always_inline))
436 vm_prot_t macho_segment_command::initprot() const {
437 return ENDIAN_READ32(content.initprot);
438 }
439
440 inline __attribute__((always_inline))
441 void macho_segment_command::set_initprot(vm_prot_t _value) {
442 ENDIAN_WRITE32(content.initprot, _value);
443 }
444
445 inline __attribute__((always_inline))
446 uint32_t macho_segment_command::nsects() const {
447 return ENDIAN_READ32(content.nsects);
448 }
449
450 inline __attribute__((always_inline))
451 void macho_segment_command::set_nsects(uint32_t _value) {
452 ENDIAN_WRITE32(content.nsects, _value);
453 }
454
455 inline __attribute__((always_inline))
456 uint32_t macho_segment_command::flags() const {
457 return ENDIAN_READ32(content.flags);
458 }
459
460 inline __attribute__((always_inline))
461 void macho_segment_command::set_flags(uint32_t _value) {
462 ENDIAN_WRITE32(content.flags, _value);
463 }
464
465 #undef section
466 #undef section_64
467 class macho_section {
468 public:
469 const char* sectname() const;
470 void set_sectname(const char*);
471
472 const char* segname() const;
473 void set_segname(const char*);
474
475 uint64_t addr() const;
476 void set_addr(uint64_t);
477
478 uint64_t size() const;
479 void set_size(uint64_t);
480
481 uint32_t offset() const;
482 void set_offset(uint32_t);
483
484 uint32_t align() const;
485 void set_align(uint32_t);
486
487 uint32_t reloff() const;
488 void set_reloff(uint32_t);
489
490 uint32_t nreloc() const;
491 void set_nreloc(uint32_t);
492
493 uint32_t flags() const;
494 void set_flags(uint32_t);
495
496 uint32_t reserved1() const;
497 void set_reserved1(uint32_t);
498
499 uint32_t reserved2() const;
500 void set_reserved2(uint32_t);
501
502 enum { content_size =
503 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
504 sizeof(section_64) };
505 #else
506 sizeof(section) };
507 #endif
508
509 private:
510 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
511 struct section_64 content;
512 #else
513 struct section content;
514 #endif
515 };
516 #define section __my_bad
517 #define section_64 __my_bad
518
519 inline __attribute__((always_inline))
520 const char* macho_section::sectname() const {
521 return content.sectname;
522 }
523
524 inline __attribute__((always_inline))
525 void macho_section::set_sectname(const char* _value) {
526 strncpy(content.sectname, _value, 16);
527 }
528
529 inline __attribute__((always_inline))
530 const char* macho_section::segname() const {
531 return content.segname;
532 }
533
534 inline __attribute__((always_inline))
535 void macho_section::set_segname(const char* _value) {
536 strncpy(content.segname, _value, 16);
537 }
538
539 inline __attribute__((always_inline))
540 uint64_t macho_section::addr() const {
541 #if defined(ARCH_PPC64)
542 return ENDIAN_SWAP64(content.addr);
543 #elif defined(ARCH_PPC) || defined(ARCH_I386)
544 return ENDIAN_READ32(content.addr);
545 #else
546 #error unknown architecture
547 #endif
548 }
549
550 inline __attribute__((always_inline))
551 void macho_section::set_addr(uint64_t _value) {
552 #if defined(ARCH_PPC64)
553 content.addr = ENDIAN_SWAP64(_value);
554 #elif defined(ARCH_PPC) || defined(ARCH_I386)
555 ENDIAN_WRITE32(content.addr, _value);
556 #else
557 #error unknown architecture
558 #endif
559 }
560
561 inline __attribute__((always_inline))
562 uint64_t macho_section::size() const {
563 #if defined(ARCH_PPC64)
564 return ENDIAN_SWAP64(content.size);
565 #elif defined(ARCH_PPC) || defined(ARCH_I386)
566 return ENDIAN_READ32(content.size);
567 #else
568 #error unknown architecture
569 #endif
570 }
571
572 inline __attribute__((always_inline))
573 void macho_section::set_size(uint64_t _value) {
574 #if defined(ARCH_PPC64)
575 content.size = ENDIAN_SWAP64(_value);
576 #elif defined(ARCH_PPC) || defined(ARCH_I386)
577 ENDIAN_WRITE32(content.size, _value);
578 #else
579 #error unknown architecture
580 #endif
581 }
582
583 inline __attribute__((always_inline))
584 uint32_t macho_section::offset() const {
585 return ENDIAN_READ32(content.offset);
586 }
587
588 inline __attribute__((always_inline))
589 void macho_section::set_offset(uint32_t _value) {
590 ENDIAN_WRITE32(content.offset, _value);
591 }
592
593 inline __attribute__((always_inline))
594 uint32_t macho_section::align() const {
595 return ENDIAN_READ32(content.align);
596 }
597
598 inline __attribute__((always_inline))
599 void macho_section::set_align(uint32_t _value) {
600 ENDIAN_WRITE32(content.align, _value);
601 }
602
603 inline __attribute__((always_inline))
604 uint32_t macho_section::reloff() const {
605 return ENDIAN_READ32(content.reloff);
606 }
607
608 inline __attribute__((always_inline))
609 void macho_section::set_reloff(uint32_t _value) {
610 ENDIAN_WRITE32(content.reloff, _value);
611 }
612
613 inline __attribute__((always_inline))
614 uint32_t macho_section::nreloc() const {
615 return ENDIAN_READ32(content.nreloc);
616 }
617
618 inline __attribute__((always_inline))
619 void macho_section::set_nreloc(uint32_t _value) {
620 ENDIAN_WRITE32(content.nreloc, _value);
621 }
622
623 inline __attribute__((always_inline))
624 uint32_t macho_section::flags() const {
625 return ENDIAN_READ32(content.flags);
626 }
627
628 inline __attribute__((always_inline))
629 void macho_section::set_flags(uint32_t _value) {
630 ENDIAN_WRITE32(content.flags, _value);
631 }
632
633 inline __attribute__((always_inline))
634 uint32_t macho_section::reserved1() const {
635 return ENDIAN_READ32(content.reserved1);
636 }
637
638 inline __attribute__((always_inline))
639 void macho_section::set_reserved1(uint32_t _value) {
640 ENDIAN_WRITE32(content.reserved1, _value);
641 }
642
643 inline __attribute__((always_inline))
644 uint32_t macho_section::reserved2() const {
645 return ENDIAN_READ32(content.reserved2);
646 }
647
648 inline __attribute__((always_inline))
649 void macho_section::set_reserved2(uint32_t _value) {
650 ENDIAN_WRITE32(content.reserved2, _value);
651 }
652
653 #undef dylib_command
654 class macho_dylib_command {
655 public:
656 uint32_t cmd() const;
657 void set_cmd(uint32_t);
658
659 uint32_t cmdsize() const;
660 void set_cmdsize(uint32_t);
661
662 const char* name() const;
663 void set_name_offset();
664
665 uint32_t timestamp() const;
666 void set_timestamp(uint32_t);
667
668 uint32_t current_version() const;
669 void set_current_version(uint32_t);
670
671 uint32_t compatibility_version() const;
672 void set_compatibility_version(uint32_t);
673
674 enum { name_offset = sizeof(struct dylib_command) };
675
676 private:
677 struct dylib_command content;
678 };
679 #define dylib_command __my_bad
680
681 inline __attribute__((always_inline))
682 uint32_t macho_dylib_command::cmd() const {
683 return ENDIAN_READ32(content.cmd);
684 }
685
686 inline __attribute__((always_inline))
687 void macho_dylib_command::set_cmd(uint32_t _value) {
688 ENDIAN_WRITE32(content.cmd, _value);
689 }
690
691 inline __attribute__((always_inline))
692 uint32_t macho_dylib_command::cmdsize() const {
693 return ENDIAN_READ32(content.cmdsize);
694 }
695
696 inline __attribute__((always_inline))
697 void macho_dylib_command::set_cmdsize(uint32_t _value) {
698 ENDIAN_WRITE32(content.cmdsize, _value);
699 }
700
701 inline __attribute__((always_inline))
702 const char* macho_dylib_command::name() const {
703 return (char*)(&content) + ENDIAN_READ32(content.dylib.name.offset);
704 }
705
706 inline __attribute__((always_inline))
707 void macho_dylib_command::set_name_offset() {
708 ENDIAN_WRITE32(content.dylib.name.offset, name_offset);
709 }
710
711 inline __attribute__((always_inline))
712 uint32_t macho_dylib_command::timestamp() const {
713 return ENDIAN_READ32(content.dylib.timestamp);
714 }
715
716 inline __attribute__((always_inline))
717 void macho_dylib_command::set_timestamp(uint32_t _value) {
718 ENDIAN_WRITE32(content.dylib.timestamp, _value);
719 }
720
721 inline __attribute__((always_inline))
722 uint32_t macho_dylib_command::current_version() const {
723 return ENDIAN_READ32(content.dylib.current_version);
724 }
725
726 inline __attribute__((always_inline))
727 void macho_dylib_command::set_current_version(uint32_t _value) {
728 ENDIAN_WRITE32(content.dylib.current_version, _value);
729 }
730
731 inline __attribute__((always_inline))
732 uint32_t macho_dylib_command::compatibility_version() const {
733 return ENDIAN_READ32(content.dylib.compatibility_version);
734 }
735
736 inline __attribute__((always_inline))
737 void macho_dylib_command::set_compatibility_version(uint32_t _value) {
738 ENDIAN_WRITE32(content.dylib.compatibility_version, _value);
739 }
740
741
742
743 #undef dylinker_command
744 class macho_dylinker_command {
745 public:
746 uint32_t cmd() const;
747 void set_cmd(uint32_t);
748
749 uint32_t cmdsize() const;
750 void set_cmdsize(uint32_t);
751
752 void set_name_offset();
753
754 enum { name_offset = sizeof(struct dylinker_command) };
755
756 private:
757 struct dylinker_command content;
758 };
759 #define dylinker_command __my_bad
760
761 inline __attribute__((always_inline))
762 uint32_t macho_dylinker_command::cmd() const {
763 return ENDIAN_READ32(content.cmd);
764 }
765
766 inline __attribute__((always_inline))
767 void macho_dylinker_command::set_cmd(uint32_t _value) {
768 ENDIAN_WRITE32(content.cmd, _value);
769 }
770
771 inline __attribute__((always_inline))
772 uint32_t macho_dylinker_command::cmdsize() const {
773 return ENDIAN_READ32(content.cmdsize);
774 }
775
776 inline __attribute__((always_inline))
777 void macho_dylinker_command::set_cmdsize(uint32_t _value) {
778 ENDIAN_WRITE32(content.cmdsize, _value);
779 }
780
781 inline __attribute__((always_inline))
782 void macho_dylinker_command::set_name_offset() {
783 ENDIAN_WRITE32(content.name.offset, name_offset);
784 }
785
786
787
788 #undef sub_framework_command
789 class macho_sub_framework_command {
790 public:
791 uint32_t cmd() const;
792 void set_cmd(uint32_t);
793
794 uint32_t cmdsize() const;
795 void set_cmdsize(uint32_t);
796
797 const char* name() const;
798 void set_name_offset();
799
800 enum { name_offset = sizeof(struct sub_framework_command) };
801
802 private:
803 struct sub_framework_command content;
804 };
805 #define sub_framework_command __my_bad
806
807 inline __attribute__((always_inline))
808 uint32_t macho_sub_framework_command::cmd() const {
809 return ENDIAN_READ32(content.cmd);
810 }
811
812 inline __attribute__((always_inline))
813 void macho_sub_framework_command::set_cmd(uint32_t _value) {
814 ENDIAN_WRITE32(content.cmd, _value);
815 }
816
817 inline __attribute__((always_inline))
818 uint32_t macho_sub_framework_command::cmdsize() const {
819 return ENDIAN_READ32(content.cmdsize);
820 }
821
822 inline __attribute__((always_inline))
823 void macho_sub_framework_command::set_cmdsize(uint32_t _value) {
824 ENDIAN_WRITE32(content.cmdsize, _value);
825 }
826
827 inline __attribute__((always_inline))
828 const char* macho_sub_framework_command::name() const {
829 return (char*)(&content) + ENDIAN_READ32(content.umbrella.offset);
830 }
831
832 inline __attribute__((always_inline))
833 void macho_sub_framework_command::set_name_offset() {
834 ENDIAN_WRITE32(content.umbrella.offset, name_offset);
835 }
836
837 #undef sub_client_command
838 class macho_sub_client_command {
839 public:
840 uint32_t cmd() const;
841 void set_cmd(uint32_t);
842
843 uint32_t cmdsize() const;
844 void set_cmdsize(uint32_t);
845
846 const char* name() const;
847 void set_name_offset();
848
849 enum { name_offset = sizeof(struct sub_client_command) };
850 private:
851 struct sub_client_command content;
852 };
853 #define sub_client_command __my_bad
854
855 inline __attribute__((always_inline))
856 uint32_t macho_sub_client_command::cmd() const {
857 return ENDIAN_READ32(content.cmd);
858 }
859
860 inline __attribute__((always_inline))
861 void macho_sub_client_command::set_cmd(uint32_t _value) {
862 ENDIAN_WRITE32(content.cmd, _value);
863 }
864
865 inline __attribute__((always_inline))
866 uint32_t macho_sub_client_command::cmdsize() const {
867 return ENDIAN_READ32(content.cmdsize);
868 }
869
870 inline __attribute__((always_inline))
871 void macho_sub_client_command::set_cmdsize(uint32_t _value) {
872 ENDIAN_WRITE32(content.cmdsize, _value);
873 }
874
875 inline __attribute__((always_inline))
876 const char* macho_sub_client_command::name() const {
877 return (char*)(&content) + ENDIAN_READ32(content.client.offset);
878 }
879
880 inline __attribute__((always_inline))
881 void macho_sub_client_command::set_name_offset() {
882 ENDIAN_WRITE32(content.client.offset, name_offset);
883 }
884
885
886
887 #undef sub_umbrella_command
888 class macho_sub_umbrella_command {
889 public:
890 uint32_t cmd() const;
891 void set_cmd(uint32_t);
892
893 uint32_t cmdsize() const;
894 void set_cmdsize(uint32_t);
895
896 const char* name() const;
897 void set_name_offset();
898
899 enum { name_offset = sizeof(struct sub_umbrella_command) };
900 private:
901 struct sub_umbrella_command content;
902 };
903 #define sub_umbrella_command __my_bad
904
905 inline __attribute__((always_inline))
906 uint32_t macho_sub_umbrella_command::cmd() const {
907 return ENDIAN_READ32(content.cmd);
908 }
909
910 inline __attribute__((always_inline))
911 void macho_sub_umbrella_command::set_cmd(uint32_t _value) {
912 ENDIAN_WRITE32(content.cmd, _value);
913 }
914
915 inline __attribute__((always_inline))
916 uint32_t macho_sub_umbrella_command::cmdsize() const {
917 return ENDIAN_READ32(content.cmdsize);
918 }
919
920 inline __attribute__((always_inline))
921 void macho_sub_umbrella_command::set_cmdsize(uint32_t _value) {
922 ENDIAN_WRITE32(content.cmdsize, _value);
923 }
924
925 inline __attribute__((always_inline))
926 const char* macho_sub_umbrella_command::name() const {
927 return (char*)(&content) + ENDIAN_READ32(content.sub_umbrella.offset);
928 }
929
930 inline __attribute__((always_inline))
931 void macho_sub_umbrella_command::set_name_offset() {
932 ENDIAN_WRITE32(content.sub_umbrella.offset, name_offset);
933 }
934
935
936
937
938 #undef sub_library_command
939 class macho_sub_library_command {
940 public:
941 uint32_t cmd() const;
942 void set_cmd(uint32_t);
943
944 uint32_t cmdsize() const;
945 void set_cmdsize(uint32_t);
946
947 const char* name() const;
948 void set_name_offset();
949
950 enum { name_offset = sizeof(struct sub_library_command) };
951 private:
952 struct sub_library_command content;
953 };
954 #define sub_library_command __my_bad
955
956 inline __attribute__((always_inline))
957 uint32_t macho_sub_library_command::cmd() const {
958 return ENDIAN_READ32(content.cmd);
959 }
960
961 inline __attribute__((always_inline))
962 void macho_sub_library_command::set_cmd(uint32_t _value) {
963 ENDIAN_WRITE32(content.cmd, _value);
964 }
965
966 inline __attribute__((always_inline))
967 uint32_t macho_sub_library_command::cmdsize() const {
968 return ENDIAN_READ32(content.cmdsize);
969 }
970
971 inline __attribute__((always_inline))
972 void macho_sub_library_command::set_cmdsize(uint32_t _value) {
973 ENDIAN_WRITE32(content.cmdsize, _value);
974 }
975
976 inline __attribute__((always_inline))
977 const char* macho_sub_library_command::name() const {
978 return (char*)(&content) + ENDIAN_READ32(content.sub_library.offset);
979 }
980
981 inline __attribute__((always_inline))
982 void macho_sub_library_command::set_name_offset() {
983 ENDIAN_WRITE32(content.sub_library.offset, name_offset);
984 }
985
986
987
988 #undef routines_command
989 #undef routines_command_64
990 class macho_routines_command {
991 public:
992 uint32_t cmd() const;
993 void set_cmd(uint32_t);
994
995 uint32_t cmdsize() const;
996 void set_cmdsize(uint32_t);
997
998 uint64_t init_address() const;
999 void set_init_address(uint64_t);
1000
1001 uint64_t init_module() const;
1002 void set_init_module(uint64_t);
1003
1004 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
1005 enum { size = sizeof(struct routines_command_64) };
1006 enum { command = LC_ROUTINES_64 };
1007 #else
1008 enum { size = sizeof(struct routines_command) };
1009 enum { command = LC_ROUTINES };
1010 #endif
1011
1012 private:
1013 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
1014 struct routines_command_64 content;
1015 #else
1016 struct routines_command content;
1017 #endif
1018 };
1019 #define routines_command __my_bad
1020 #define routines_command_64 __my_bad
1021
1022 inline __attribute__((always_inline))
1023 uint32_t macho_routines_command::cmd() const {
1024 return ENDIAN_READ32(content.cmd);
1025 }
1026
1027 inline __attribute__((always_inline))
1028 void macho_routines_command::set_cmd(uint32_t _value) {
1029 ENDIAN_WRITE32(content.cmd, _value);
1030 }
1031
1032 inline __attribute__((always_inline))
1033 uint32_t macho_routines_command::cmdsize() const {
1034 return ENDIAN_READ32(content.cmdsize);
1035 }
1036
1037 inline __attribute__((always_inline))
1038 void macho_routines_command::set_cmdsize(uint32_t _value) {
1039 ENDIAN_WRITE32(content.cmdsize, _value);
1040 }
1041
1042 inline __attribute__((always_inline))
1043 uint64_t macho_routines_command::init_address() const {
1044 return ENDIAN_SWAP64(content.init_address);
1045 }
1046
1047 inline __attribute__((always_inline))
1048 void macho_routines_command::set_init_address(uint64_t _value) {
1049 content.init_address = ENDIAN_SWAP64(_value);
1050 }
1051
1052 inline __attribute__((always_inline))
1053 uint64_t macho_routines_command::init_module() const {
1054 return ENDIAN_SWAP64(content.init_module);
1055 }
1056
1057 inline __attribute__((always_inline))
1058 void macho_routines_command::set_init_module(uint64_t _value) {
1059 content.init_module = ENDIAN_SWAP64(_value);
1060 }
1061
1062
1063
1064 #undef symtab_command
1065 class macho_symtab_command {
1066 public:
1067 uint32_t cmd() const;
1068 void set_cmd(uint32_t);
1069
1070 uint32_t cmdsize() const;
1071 void set_cmdsize(uint32_t);
1072
1073 uint32_t symoff() const;
1074 void set_symoff(uint32_t);
1075
1076 uint32_t nsyms() const;
1077 void set_nsyms(uint32_t);
1078
1079 uint32_t stroff() const;
1080 void set_stroff(uint32_t);
1081
1082 uint32_t strsize() const;
1083 void set_strsize(uint32_t);
1084
1085 enum { size = sizeof(struct symtab_command ) };
1086
1087 private:
1088 struct symtab_command content;
1089 };
1090 #define symtab_command __my_bad
1091
1092
1093 inline __attribute__((always_inline))
1094 uint32_t macho_symtab_command::cmd() const {
1095 return ENDIAN_READ32(content.cmd);
1096 }
1097
1098 inline __attribute__((always_inline))
1099 void macho_symtab_command::set_cmd(uint32_t _value) {
1100 ENDIAN_WRITE32(content.cmd, _value);
1101 }
1102
1103 inline __attribute__((always_inline))
1104 uint32_t macho_symtab_command::cmdsize() const {
1105 return ENDIAN_READ32(content.cmdsize);
1106 }
1107
1108 inline __attribute__((always_inline))
1109 void macho_symtab_command::set_cmdsize(uint32_t _value) {
1110 ENDIAN_WRITE32(content.cmdsize, _value);
1111 }
1112
1113 inline __attribute__((always_inline))
1114 uint32_t macho_symtab_command::symoff() const {
1115 return ENDIAN_READ32(content.symoff);
1116 }
1117
1118 inline __attribute__((always_inline))
1119 void macho_symtab_command::set_symoff(uint32_t _value) {
1120 ENDIAN_WRITE32(content.symoff, _value);
1121 }
1122
1123 inline __attribute__((always_inline))
1124 uint32_t macho_symtab_command::nsyms() const {
1125 return ENDIAN_READ32(content.nsyms);
1126 }
1127
1128 inline __attribute__((always_inline))
1129 void macho_symtab_command::set_nsyms(uint32_t _value) {
1130 ENDIAN_WRITE32(content.nsyms, _value);
1131 }
1132
1133 inline __attribute__((always_inline))
1134 uint32_t macho_symtab_command::stroff() const {
1135 return ENDIAN_READ32(content.stroff);
1136 }
1137
1138 inline __attribute__((always_inline))
1139 void macho_symtab_command::set_stroff(uint32_t _value) {
1140 ENDIAN_WRITE32(content.stroff, _value);
1141 }
1142
1143 inline __attribute__((always_inline))
1144 uint32_t macho_symtab_command::strsize() const {
1145 return ENDIAN_READ32(content.strsize);
1146 }
1147
1148 inline __attribute__((always_inline))
1149 void macho_symtab_command::set_strsize(uint32_t _value) {
1150 ENDIAN_WRITE32(content.strsize, _value);
1151 }
1152
1153
1154 #undef dysymtab_command
1155 class macho_dysymtab_command {
1156 public:
1157 uint32_t cmd() const;
1158 void set_cmd(uint32_t);
1159
1160 uint32_t cmdsize() const;
1161 void set_cmdsize(uint32_t);
1162
1163 uint32_t ilocalsym() const;
1164 void set_ilocalsym(uint32_t);
1165
1166 uint32_t nlocalsym() const;
1167 void set_nlocalsym(uint32_t);
1168
1169 uint32_t iextdefsym() const;
1170 void set_iextdefsym(uint32_t);
1171
1172 uint32_t nextdefsym() const;
1173 void set_nextdefsym(uint32_t);
1174
1175 uint32_t iundefsym() const;
1176 void set_iundefsym(uint32_t);
1177
1178 uint32_t nundefsym() const;
1179 void set_nundefsym(uint32_t);
1180
1181 uint32_t tocoff() const;
1182 void set_tocoff(uint32_t);
1183
1184 uint32_t ntoc() const;
1185 void set_ntoc(uint32_t);
1186
1187 uint32_t modtaboff() const;
1188 void set_modtaboff(uint32_t);
1189
1190 uint32_t nmodtab() const;
1191 void set_nmodtab(uint32_t);
1192
1193 uint32_t extrefsymoff() const;
1194 void set_extrefsymoff(uint32_t);
1195
1196 uint32_t nextrefsyms() const;
1197 void set_nextrefsyms(uint32_t);
1198
1199 uint32_t indirectsymoff() const;
1200 void set_indirectsymoff(uint32_t);
1201
1202 uint32_t nindirectsyms() const;
1203 void set_nindirectsyms(uint32_t);
1204
1205 uint32_t extreloff() const;
1206 void set_extreloff(uint32_t);
1207
1208 uint32_t nextrel() const;
1209 void set_nextrel(uint32_t);
1210
1211 uint32_t locreloff() const;
1212 void set_locreloff(uint32_t);
1213
1214 uint32_t nlocrel() const;
1215 void set_nlocrel(uint32_t);
1216
1217 enum { size = sizeof(struct dysymtab_command ) };
1218 private:
1219 struct dysymtab_command content;
1220 };
1221 #define dysymtab_command __my_bad
1222
1223 inline __attribute__((always_inline))
1224 uint32_t macho_dysymtab_command::cmd() const {
1225 return ENDIAN_READ32(content.cmd);
1226 }
1227
1228 inline __attribute__((always_inline))
1229 void macho_dysymtab_command::set_cmd(uint32_t _value) {
1230 ENDIAN_WRITE32(content.cmd, _value);
1231 }
1232
1233 inline __attribute__((always_inline))
1234 uint32_t macho_dysymtab_command::cmdsize() const {
1235 return ENDIAN_READ32(content.cmdsize);
1236 }
1237
1238 inline __attribute__((always_inline))
1239 void macho_dysymtab_command::set_cmdsize(uint32_t _value) {
1240 ENDIAN_WRITE32(content.cmdsize, _value);
1241 }
1242
1243 inline __attribute__((always_inline))
1244 uint32_t macho_dysymtab_command::ilocalsym() const {
1245 return ENDIAN_READ32(content.ilocalsym);
1246 }
1247
1248 inline __attribute__((always_inline))
1249 void macho_dysymtab_command::set_ilocalsym(uint32_t _value) {
1250 ENDIAN_WRITE32(content.ilocalsym, _value);
1251 }
1252
1253 inline __attribute__((always_inline))
1254 uint32_t macho_dysymtab_command::nlocalsym() const {
1255 return ENDIAN_READ32(content.nlocalsym);
1256 }
1257
1258 inline __attribute__((always_inline))
1259 void macho_dysymtab_command::set_nlocalsym(uint32_t _value) {
1260 ENDIAN_WRITE32(content.nlocalsym, _value);
1261 }
1262
1263 inline __attribute__((always_inline))
1264 uint32_t macho_dysymtab_command::iextdefsym() const {
1265 return ENDIAN_READ32(content.iextdefsym);
1266 }
1267
1268 inline __attribute__((always_inline))
1269 void macho_dysymtab_command::set_iextdefsym(uint32_t _value) {
1270 ENDIAN_WRITE32(content.iextdefsym, _value);
1271 }
1272
1273 inline __attribute__((always_inline))
1274 uint32_t macho_dysymtab_command::nextdefsym() const {
1275 return ENDIAN_READ32(content.nextdefsym);
1276 }
1277
1278 inline __attribute__((always_inline))
1279 void macho_dysymtab_command::set_nextdefsym(uint32_t _value) {
1280 ENDIAN_WRITE32(content.nextdefsym, _value);
1281 }
1282
1283 inline __attribute__((always_inline))
1284 uint32_t macho_dysymtab_command::iundefsym() const {
1285 return ENDIAN_READ32(content.iundefsym);
1286 }
1287
1288 inline __attribute__((always_inline))
1289 void macho_dysymtab_command::set_iundefsym(uint32_t _value) {
1290 ENDIAN_WRITE32(content.iundefsym, _value);
1291 }
1292
1293 inline __attribute__((always_inline))
1294 uint32_t macho_dysymtab_command::nundefsym() const {
1295 return ENDIAN_READ32(content.nundefsym);
1296 }
1297
1298 inline __attribute__((always_inline))
1299 void macho_dysymtab_command::set_nundefsym(uint32_t _value) {
1300 ENDIAN_WRITE32(content.nundefsym, _value);
1301 }
1302
1303 inline __attribute__((always_inline))
1304 uint32_t macho_dysymtab_command::tocoff() const {
1305 return ENDIAN_READ32(content.tocoff);
1306 }
1307
1308 inline __attribute__((always_inline))
1309 void macho_dysymtab_command::set_tocoff(uint32_t _value) {
1310 ENDIAN_WRITE32(content.tocoff, _value);
1311 }
1312
1313 inline __attribute__((always_inline))
1314 uint32_t macho_dysymtab_command::ntoc() const {
1315 return ENDIAN_READ32(content.ntoc);
1316 }
1317
1318 inline __attribute__((always_inline))
1319 void macho_dysymtab_command::set_ntoc(uint32_t _value) {
1320 ENDIAN_WRITE32(content.ntoc, _value);
1321 }
1322
1323 inline __attribute__((always_inline))
1324 uint32_t macho_dysymtab_command::modtaboff() const {
1325 return ENDIAN_READ32(content.modtaboff);
1326 }
1327
1328 inline __attribute__((always_inline))
1329 void macho_dysymtab_command::set_modtaboff(uint32_t _value) {
1330 ENDIAN_WRITE32(content.modtaboff, _value);
1331 }
1332
1333 inline __attribute__((always_inline))
1334 uint32_t macho_dysymtab_command::nmodtab() const {
1335 return ENDIAN_READ32(content.nmodtab);
1336 }
1337
1338 inline __attribute__((always_inline))
1339 void macho_dysymtab_command::set_nmodtab(uint32_t _value) {
1340 ENDIAN_WRITE32(content.nmodtab, _value);
1341 }
1342
1343 inline __attribute__((always_inline))
1344 uint32_t macho_dysymtab_command::extrefsymoff() const {
1345 return ENDIAN_READ32(content.extrefsymoff);
1346 }
1347
1348 inline __attribute__((always_inline))
1349 void macho_dysymtab_command::set_extrefsymoff(uint32_t _value) {
1350 ENDIAN_WRITE32(content.extrefsymoff, _value);
1351 }
1352
1353 inline __attribute__((always_inline))
1354 uint32_t macho_dysymtab_command::nextrefsyms() const {
1355 return ENDIAN_READ32(content.nextrefsyms);
1356 }
1357
1358 inline __attribute__((always_inline))
1359 void macho_dysymtab_command::set_nextrefsyms(uint32_t _value) {
1360 ENDIAN_WRITE32(content.nextrefsyms, _value);
1361 }
1362
1363 inline __attribute__((always_inline))
1364 uint32_t macho_dysymtab_command::indirectsymoff() const {
1365 return ENDIAN_READ32(content.indirectsymoff);
1366 }
1367
1368 inline __attribute__((always_inline))
1369 void macho_dysymtab_command::set_indirectsymoff(uint32_t _value) {
1370 ENDIAN_WRITE32(content.indirectsymoff, _value);
1371 }
1372
1373 inline __attribute__((always_inline))
1374 uint32_t macho_dysymtab_command::nindirectsyms() const {
1375 return ENDIAN_READ32(content.nindirectsyms);
1376 }
1377
1378 inline __attribute__((always_inline))
1379 void macho_dysymtab_command::set_nindirectsyms(uint32_t _value) {
1380 ENDIAN_WRITE32(content.nindirectsyms, _value);
1381 }
1382
1383 inline __attribute__((always_inline))
1384 uint32_t macho_dysymtab_command::extreloff() const {
1385 return ENDIAN_READ32(content.extreloff);
1386 }
1387
1388 inline __attribute__((always_inline))
1389 void macho_dysymtab_command::set_extreloff(uint32_t _value) {
1390 ENDIAN_WRITE32(content.extreloff, _value);
1391 }
1392
1393 inline __attribute__((always_inline))
1394 uint32_t macho_dysymtab_command::nextrel() const {
1395 return ENDIAN_READ32(content.nextrel);
1396 }
1397
1398 inline __attribute__((always_inline))
1399 void macho_dysymtab_command::set_nextrel(uint32_t _value) {
1400 ENDIAN_WRITE32(content.nextrel, _value);
1401 }
1402
1403 inline __attribute__((always_inline))
1404 uint32_t macho_dysymtab_command::locreloff() const {
1405 return ENDIAN_READ32(content.locreloff);
1406 }
1407
1408 inline __attribute__((always_inline))
1409 void macho_dysymtab_command::set_locreloff(uint32_t _value) {
1410 ENDIAN_WRITE32(content.locreloff, _value);
1411 }
1412
1413 inline __attribute__((always_inline))
1414 uint32_t macho_dysymtab_command::nlocrel() const {
1415 return ENDIAN_READ32(content.nlocrel);
1416 }
1417
1418 inline __attribute__((always_inline))
1419 void macho_dysymtab_command::set_nlocrel(uint32_t _value) {
1420 ENDIAN_WRITE32(content.nlocrel, _value);
1421 }
1422
1423
1424
1425 #undef twolevel_hints_command
1426 class macho_twolevel_hints_command {
1427 public:
1428 uint32_t cmd() const;
1429 void set_cmd(uint32_t);
1430
1431 uint32_t cmdsize() const;
1432 void set_cmdsize(uint32_t);
1433
1434 uint32_t offset() const;
1435 void set_offset(uint32_t);
1436
1437 uint32_t nhints() const;
1438 void set_nhints(uint32_t);
1439
1440 private:
1441 struct twolevel_hints_command content;
1442 };
1443 #define twolevel_hints_command __my_bad
1444
1445 inline __attribute__((always_inline))
1446 uint32_t macho_twolevel_hints_command::cmd() const {
1447 return ENDIAN_READ32(content.cmd);
1448 }
1449
1450 inline __attribute__((always_inline))
1451 void macho_twolevel_hints_command::set_cmd(uint32_t _value) {
1452 ENDIAN_WRITE32(content.cmd, _value);
1453 }
1454
1455 inline __attribute__((always_inline))
1456 uint32_t macho_twolevel_hints_command::cmdsize() const {
1457 return ENDIAN_READ32(content.cmdsize);
1458 }
1459
1460 inline __attribute__((always_inline))
1461 void macho_twolevel_hints_command::set_cmdsize(uint32_t _value) {
1462 ENDIAN_WRITE32(content.cmdsize, _value);
1463 }
1464
1465 inline __attribute__((always_inline))
1466 uint32_t macho_twolevel_hints_command::offset() const {
1467 return ENDIAN_READ32(content.offset);
1468 }
1469
1470 inline __attribute__((always_inline))
1471 void macho_twolevel_hints_command::set_offset(uint32_t _value) {
1472 ENDIAN_WRITE32(content.offset, _value);
1473 }
1474
1475 inline __attribute__((always_inline))
1476 uint32_t macho_twolevel_hints_command::nhints() const {
1477 return ENDIAN_READ32(content.nhints);
1478 }
1479
1480 inline __attribute__((always_inline))
1481 void macho_twolevel_hints_command::set_nhints(uint32_t _value) {
1482 ENDIAN_WRITE32(content.nhints, _value);
1483 }
1484
1485
1486 #undef thread_command
1487 class macho_thread_command {
1488 public:
1489 uint32_t cmd() const;
1490 void set_cmd(uint32_t);
1491
1492 uint32_t cmdsize() const;
1493 void set_cmdsize(uint32_t);
1494
1495 uint32_t flavor() const;
1496 void set_flavor(uint32_t);
1497
1498 uint32_t count() const;
1499 void set_count(uint32_t);
1500
1501 uint32_t threadState32(uint32_t index) const;
1502 void set_threadState32(uint32_t index, uint32_t value);
1503
1504 uint64_t threadState64(uint32_t offset) const;
1505 void set_threadState64(uint32_t index, uint64_t value);
1506
1507 enum { size = sizeof(struct thread_command) + 8 };
1508
1509 private:
1510 struct thread_command content;
1511 uint32_t content_flavor;
1512 uint32_t content_count;
1513 uint32_t threadState[1];
1514 };
1515 #define thread_command __my_bad
1516
1517 inline __attribute__((always_inline))
1518 uint32_t macho_thread_command::cmd() const {
1519 return ENDIAN_READ32(content.cmd);
1520 }
1521
1522 inline __attribute__((always_inline))
1523 void macho_thread_command::set_cmd(uint32_t _value) {
1524 ENDIAN_WRITE32(content.cmd, _value);
1525 }
1526
1527 inline __attribute__((always_inline))
1528 uint32_t macho_thread_command::cmdsize() const {
1529 return ENDIAN_READ32(content.cmdsize);
1530 }
1531
1532 inline __attribute__((always_inline))
1533 void macho_thread_command::set_cmdsize(uint32_t _value) {
1534 ENDIAN_WRITE32(content.cmdsize, _value);
1535 }
1536
1537 inline __attribute__((always_inline))
1538 uint32_t macho_thread_command::flavor() const {
1539 return ENDIAN_READ32(content_flavor);
1540 }
1541
1542 inline __attribute__((always_inline))
1543 void macho_thread_command::set_flavor(uint32_t _value) {
1544 ENDIAN_WRITE32(content_flavor, _value);
1545 }
1546
1547 inline __attribute__((always_inline))
1548 uint32_t macho_thread_command::count() const {
1549 return ENDIAN_READ32(content_count);
1550 }
1551
1552 inline __attribute__((always_inline))
1553 void macho_thread_command::set_count(uint32_t _value) {
1554 ENDIAN_WRITE32(content_count, _value);
1555 }
1556
1557 inline __attribute__((always_inline))
1558 uint32_t macho_thread_command::threadState32(uint32_t index) const
1559 {
1560 return ENDIAN_READ32(threadState[index]);
1561 }
1562
1563 inline __attribute__((always_inline))
1564 void macho_thread_command::set_threadState32(uint32_t index, uint32_t _value)
1565 {
1566 ENDIAN_WRITE32(threadState[index], _value);
1567 }
1568
1569 inline __attribute__((always_inline))
1570 uint64_t macho_thread_command::threadState64(uint32_t index) const
1571 {
1572 uint64_t temp = *((uint64_t*)(&threadState[index]));
1573 return ENDIAN_SWAP64(temp);
1574 }
1575
1576 inline __attribute__((always_inline))
1577 void macho_thread_command::set_threadState64(uint32_t index, uint64_t _value)
1578 {
1579 *((uint64_t*)(&threadState[index])) = ENDIAN_SWAP64(_value);
1580 }
1581
1582
1583
1584 #undef nlist
1585 #undef nlist_64
1586 class macho_nlist {
1587 public:
1588 uint32_t n_strx() const;
1589 void set_n_strx(uint32_t);
1590
1591 uint8_t n_type() const;
1592 void set_n_type(uint8_t);
1593
1594 uint8_t n_sect() const;
1595 void set_n_sect(uint8_t);
1596
1597 uint16_t n_desc() const;
1598 void set_n_desc(uint16_t);
1599
1600 uint64_t n_value() const;
1601 void set_n_value(uint64_t);
1602
1603
1604 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
1605 enum { size = sizeof(struct nlist_64) };
1606 #else
1607 enum { size = sizeof(struct nlist) };
1608 #endif
1609
1610 private:
1611 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
1612 struct nlist_64 content;
1613 #else
1614 struct nlist content;
1615 #endif
1616 };
1617 #define nlist __my_bad
1618 #define nlist_64 __my_bad
1619
1620 inline __attribute__((always_inline))
1621 uint32_t macho_nlist::n_strx() const {
1622 return ENDIAN_READ32(content.n_un.n_strx);
1623 }
1624
1625 inline __attribute__((always_inline))
1626 void macho_nlist::set_n_strx(uint32_t _value) {
1627 ENDIAN_WRITE32(content.n_un.n_strx, _value);
1628 }
1629
1630 inline __attribute__((always_inline))
1631 uint8_t macho_nlist::n_type() const {
1632 return content.n_type;
1633 }
1634
1635 inline __attribute__((always_inline))
1636 void macho_nlist::set_n_type(uint8_t _value) {
1637 content.n_type = _value;
1638 }
1639
1640 inline __attribute__((always_inline))
1641 uint8_t macho_nlist::n_sect() const {
1642 return content.n_sect;
1643 }
1644
1645 inline __attribute__((always_inline))
1646 void macho_nlist::set_n_sect(uint8_t _value) {
1647 content.n_sect = _value;
1648 }
1649
1650 inline __attribute__((always_inline))
1651 uint16_t macho_nlist::n_desc() const {
1652 return ENDIAN_READ16(content.n_desc);
1653 }
1654
1655 inline __attribute__((always_inline))
1656 void macho_nlist::set_n_desc(uint16_t _value) {
1657 ENDIAN_WRITE16(content.n_desc, _value);
1658 }
1659
1660 inline __attribute__((always_inline))
1661 uint64_t macho_nlist::n_value() const {
1662 #if defined(ARCH_PPC64)
1663 return ENDIAN_SWAP64(content.n_value);
1664 #elif defined(ARCH_PPC) || defined(ARCH_I386)
1665 return ENDIAN_READ32(content.n_value);
1666 #else
1667 #error unknown architecture
1668 #endif
1669 }
1670
1671 inline __attribute__((always_inline))
1672 void macho_nlist::set_n_value(uint64_t _value) {
1673 content.n_value = ENDIAN_SWAP64(_value);
1674 }
1675
1676
1677
1678 #undef relocation_info
1679 class macho_relocation_info {
1680 public:
1681 int32_t r_address() const;
1682 void set_r_address(int32_t);
1683
1684 uint32_t r_symbolnum() const;
1685 void set_r_symbolnum(uint32_t);
1686
1687 bool r_pcrel() const;
1688 void set_r_pcrel(bool);
1689
1690 uint8_t r_length() const;
1691 void set_r_length(uint8_t);
1692
1693 bool r_extern() const;
1694 void set_r_extern(bool);
1695
1696 uint8_t r_type() const;
1697 void set_r_type(uint8_t);
1698
1699 enum { size = sizeof(struct relocation_info) };
1700 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
1701 enum { pointer_length = 3 };
1702 #else
1703 enum { pointer_length = 2 };
1704 #endif
1705
1706 private:
1707 struct relocation_info content;
1708 };
1709 #define relocation_info __my_bad
1710
1711
1712 inline __attribute__((always_inline))
1713 int32_t macho_relocation_info::r_address() const {
1714 return ENDIAN_READ32(content.r_address);
1715 }
1716
1717 inline __attribute__((always_inline))
1718 void macho_relocation_info::set_r_address(int32_t _value) {
1719 ENDIAN_WRITE32(content.r_address, _value);
1720 }
1721
1722 inline __attribute__((always_inline))
1723 uint32_t macho_relocation_info::r_symbolnum() const {
1724 uint32_t temp = ENDIAN_READ32(((const uint32_t*)&content)[1]);
1725 #if defined(ARCH_PPC) || defined(ARCH_PPC64)
1726 return (temp >> 8);
1727 #elif defined(ARCH_I386)
1728 return temp & 0x00FFFFFF;
1729 #else
1730 #error unknown architecture
1731 #endif
1732 }
1733
1734 inline __attribute__((always_inline))
1735 void macho_relocation_info::set_r_symbolnum(uint32_t _value) {
1736 uint32_t temp = ENDIAN_READ32(((const uint32_t*)&content)[1]);
1737 #if defined(ARCH_PPC) || defined(ARCH_PPC64)
1738 temp &= 0x000000FF;
1739 temp |= ((_value & 0x00FFFFFF) << 8);
1740 #elif defined(ARCH_I386)
1741 temp &= 0xFF000000;
1742 temp |= (_value & 0x00FFFFFF);
1743 #else
1744 #error unknown architecture
1745 #endif
1746 ENDIAN_WRITE32(((uint32_t*)&content)[1], temp);
1747 }
1748
1749 inline __attribute__((always_inline))
1750 bool macho_relocation_info::r_pcrel() const {
1751 uint32_t temp = ENDIAN_READ32(((const uint32_t*)&content)[1]);
1752 #if defined(ARCH_PPC) || defined(ARCH_PPC64)
1753 return ((temp & 0x00000080) != 0);
1754 #elif defined(ARCH_I386)
1755 return ((temp & 0x01000000) != 0);
1756 #else
1757 #error unknown architecture
1758 #endif
1759 }
1760
1761 inline __attribute__((always_inline))
1762 void macho_relocation_info::set_r_pcrel(bool _value) {
1763 uint32_t temp = ENDIAN_READ32(((const uint32_t*)&content)[1]);
1764 #if defined(ARCH_PPC) || defined(ARCH_PPC64)
1765 temp &= 0xFFFFFF7F;
1766 if ( _value )
1767 temp |= 0x00000080;
1768 #elif defined(ARCH_I386)
1769 temp &= 0x7FFFFFFF;
1770 if ( _value )
1771 temp |= 0x01000000;
1772 #else
1773 #error unknown architecture
1774 #endif
1775 ENDIAN_WRITE32(((uint32_t*)&content)[1], temp);
1776 }
1777
1778 inline __attribute__((always_inline))
1779 uint8_t macho_relocation_info::r_length() const {
1780 uint32_t temp = ENDIAN_READ32(((const uint32_t*)&content)[1]);
1781 #if defined(ARCH_PPC) || defined(ARCH_PPC64)
1782 return ((temp & 0x00000060) >> 5);
1783 #elif defined(ARCH_I386)
1784 return ((temp & 0x06000000) >> 25);
1785 #else
1786 #error unknown architecture
1787 #endif
1788 }
1789
1790 inline __attribute__((always_inline))
1791 void macho_relocation_info::set_r_length(uint8_t _value) {
1792 uint32_t temp = ENDIAN_READ32(((const uint32_t*)&content)[1]);
1793 #if defined(ARCH_PPC) || defined(ARCH_PPC64)
1794 temp &= 0xFFFFFF9F;
1795 temp |= ((_value & 0x03) << 5);
1796 #elif defined(ARCH_I386)
1797 temp &= 0xF9FFFFFF;
1798 temp |= ((_value & 0x03) << 25);
1799 #else
1800 #error unknown architecture
1801 #endif
1802 ENDIAN_WRITE32(((uint32_t*)&content)[1], temp);
1803 }
1804
1805 inline __attribute__((always_inline))
1806 bool macho_relocation_info::r_extern() const {
1807 uint32_t temp = ENDIAN_READ32(((const uint32_t*)&content)[1]);
1808 #if defined(ARCH_PPC) || defined(ARCH_PPC64)
1809 return ((temp & 0x00000010) != 0);
1810 #elif defined(ARCH_I386)
1811 return ((temp & 0x08000000) != 0);
1812 #else
1813 #error unknown architecture
1814 #endif
1815 }
1816
1817 inline __attribute__((always_inline))
1818 void macho_relocation_info::set_r_extern(bool _value) {
1819 uint32_t temp = ENDIAN_READ32(((const uint32_t*)&content)[1]);
1820 #if defined(ARCH_PPC) || defined(ARCH_PPC64)
1821 temp &= 0xFFFFFFEF;
1822 if ( _value )
1823 temp |= 0x00000010;
1824 #elif defined(ARCH_I386)
1825 temp &= 0xEFFFFFFF;
1826 if ( _value )
1827 temp |= 0x08000000;
1828 #else
1829 #error unknown architecture
1830 #endif
1831 ENDIAN_WRITE32(((uint32_t*)&content)[1], temp);
1832 }
1833
1834 inline __attribute__((always_inline))
1835 uint8_t macho_relocation_info::r_type() const {
1836 uint32_t temp = ENDIAN_READ32(((const uint32_t*)&content)[1]);
1837 #if defined(ARCH_PPC) || defined(ARCH_PPC64)
1838 return (temp & 0x0000000F);
1839 #elif defined(ARCH_I386)
1840 return ((temp & 0xF0000000) >> 28);
1841 #else
1842 #error unknown architecture
1843 #endif
1844 }
1845
1846 inline __attribute__((always_inline))
1847 void macho_relocation_info::set_r_type(uint8_t _value) {
1848 uint32_t temp = ENDIAN_READ32(((const uint32_t*)&content)[1]);
1849 #if defined(ARCH_PPC) || defined(ARCH_PPC64)
1850 temp &= 0xFFFFFFF0;
1851 temp |= (_value & 0x0F);
1852 #elif defined(ARCH_I386)
1853 temp &= 0x0FFFFFFF;
1854 temp |= ((_value & 0x0F) << 28);
1855 #else
1856 #error unknown architecture
1857 #endif
1858 ENDIAN_WRITE32(((uint32_t*)&content)[1], temp);
1859 }
1860
1861
1862
1863 #undef scattered_relocation_info
1864 class macho_scattered_relocation_info {
1865 public:
1866 bool r_scattered() const;
1867 void set_r_scattered(bool);
1868
1869 bool r_pcrel() const;
1870 void set_r_pcrel(bool);
1871
1872 uint8_t r_length() const;
1873 void set_r_length(uint8_t);
1874
1875 uint8_t r_type() const;
1876 void set_r_type(uint8_t);
1877
1878 uint32_t r_address() const;
1879 void set_r_address(uint32_t);
1880
1881 int32_t r_value() const;
1882 void set_r_value(int32_t);
1883
1884 private:
1885 struct scattered_relocation_info content;
1886 };
1887 #define scattered_relocation_info __my_bad
1888
1889 inline __attribute__((always_inline))
1890 bool macho_scattered_relocation_info::r_scattered() const {
1891 uint32_t temp = *((const uint32_t*)&content);
1892 temp = ENDIAN_READ32(temp);
1893 return ((temp & 0x80000000) != 0);
1894 }
1895
1896 inline __attribute__((always_inline))
1897 void macho_scattered_relocation_info::set_r_scattered(bool _value) {
1898 uint32_t temp = ENDIAN_READ32(*((const uint32_t*)&content));
1899 if ( _value )
1900 temp |= 0x80000000;
1901 else
1902 temp &= ~0x80000000;
1903 ENDIAN_WRITE32(*((uint32_t*)&content), temp);
1904 }
1905
1906 inline __attribute__((always_inline))
1907 bool macho_scattered_relocation_info::r_pcrel() const {
1908 uint32_t temp = *((const uint32_t*)&content);
1909 temp = ENDIAN_READ32(temp);
1910 return ((temp & 0x40000000) != 0);
1911 }
1912
1913 inline __attribute__((always_inline))
1914 void macho_scattered_relocation_info::set_r_pcrel(bool _value) {
1915 uint32_t temp = ENDIAN_READ32(*((const uint32_t*)&content));
1916 if ( _value )
1917 temp |= 0x40000000;
1918 else
1919 temp &= ~0x40000000;
1920 ENDIAN_WRITE32(*((uint32_t*)&content), temp);
1921 }
1922
1923 inline __attribute__((always_inline))
1924 uint8_t macho_scattered_relocation_info::r_length() const {
1925 uint32_t temp = ENDIAN_READ32(*((const uint32_t*)&content));
1926 return (temp >> 28) & 0x03;
1927 }
1928
1929 inline __attribute__((always_inline))
1930 void macho_scattered_relocation_info::set_r_length(uint8_t _value) {
1931 uint32_t temp = ENDIAN_READ32(*((const uint32_t*)&content));
1932 temp &= 0xCFFFFFFF;
1933 temp |= ((_value & 0x03) << 28);
1934 ENDIAN_WRITE32(*((uint32_t*)&content), temp);
1935 }
1936
1937 inline __attribute__((always_inline))
1938 uint8_t macho_scattered_relocation_info::r_type() const {
1939 uint32_t temp = ENDIAN_READ32(*((const uint32_t*)&content));
1940 return (temp >> 24) & 0x0F;
1941 }
1942
1943 inline __attribute__((always_inline))
1944 void macho_scattered_relocation_info::set_r_type(uint8_t _value) {
1945 uint32_t temp = ENDIAN_READ32(*((const uint32_t*)&content));
1946 temp &= 0xF0FFFFFF;
1947 temp |= ((_value &0x0F) << 24);
1948 ENDIAN_WRITE32(*((uint32_t*)&content), temp);
1949 }
1950
1951 inline __attribute__((always_inline))
1952 uint32_t macho_scattered_relocation_info::r_address() const {
1953 uint32_t temp = ENDIAN_READ32(*((const uint32_t*)&content));
1954 return temp & 0x00FFFFFF;
1955 }
1956
1957 inline __attribute__((always_inline))
1958 void macho_scattered_relocation_info::set_r_address(uint32_t _value) {
1959 uint32_t temp = ENDIAN_READ32(*((const uint32_t*)&content));
1960 _value &= 0x00FFFFFF;
1961 temp &= 0xFF000000;
1962 temp |= _value;
1963 ENDIAN_WRITE32(*((uint32_t*)&content), temp);
1964 }
1965
1966 inline __attribute__((always_inline))
1967 int32_t macho_scattered_relocation_info::r_value() const {
1968 return ENDIAN_READ32(content.r_value);
1969 }
1970
1971 inline __attribute__((always_inline))
1972 void macho_scattered_relocation_info::set_r_value(int32_t _value) {
1973 ENDIAN_WRITE32(content.r_value, _value);
1974 }
1975
1976
1977
1978