1 /* -*- mode: C++; c-basic-offset: 4; tab-width: 4 -*-
3 * Copyright (c) 2005 Apple Computer, Inc. All rights reserved.
5 * @APPLE_LICENSE_HEADER_START@
7 * This file contains Original Code and/or Modifications of Original Code
8 * as defined in and that are subject to the Apple Public Source License
9 * Version 2.0 (the 'License'). You may not use this file except in
10 * compliance with the License. Please obtain a copy of the License at
11 * http://www.opensource.apple.com/apsl/ and read it before using this
14 * The Original Code and all software distributed under the License are
15 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
19 * Please see the License for the specific language governing rights and
20 * limitations under the License.
22 * @APPLE_LICENSE_HEADER_END@
26 #include <mach-o/nlist.h>
27 #include <mach-o/loader.h>
28 #include <libkern/OSByteOrder.h>
36 #undef ENDIAN_SWAP_POINTER
38 #if defined(MACHO_32_SAME_ENDIAN) || defined(MACHO_64_SAME_ENDIAN)
39 #define ENDIAN_READ16(x) (x)
40 #define ENDIAN_WRITE16(into, value) into = (value);
42 #define ENDIAN_READ32(x) (x)
43 #define ENDIAN_WRITE32(into, value) into = (value);
45 #define ENDIAN_SWAP64(x) (x)
47 #elif defined(MACHO_32_OPPOSITE_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
48 #define ENDIAN_READ16(x) OSReadSwapInt16((uint16_t*)&(x), 0)
49 #define ENDIAN_WRITE16(into, value) OSWriteSwapInt16(&(into), 0, value);
51 #define ENDIAN_READ32(x) OSReadSwapInt32((uint32_t*)&(x), 0)
52 #define ENDIAN_WRITE32(into, value) OSWriteSwapInt32(&(into), 0, value);
54 #define ENDIAN_SWAP64(x) OSSwapInt64(x)
57 #error file format undefined
61 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
62 typedef uint64_t macho_uintptr_t
;
63 typedef int64_t macho_intptr_t
;
65 typedef uint32_t macho_uintptr_t
;
66 typedef int32_t macho_intptr_t
;
69 #if defined(MACHO_32_SAME_ENDIAN)
70 #define ENDIAN_SWAP_POINTER(x) (x)
71 #elif defined(MACHO_64_SAME_ENDIAN)
72 #define ENDIAN_SWAP_POINTER(x) (x)
73 #elif defined(MACHO_32_OPPOSITE_ENDIAN)
74 #define ENDIAN_SWAP_POINTER(x) OSSwapInt32(x)
75 #elif defined(MACHO_64_OPPOSITE_ENDIAN)
76 #define ENDIAN_SWAP_POINTER(x) OSSwapInt64(x)
78 #error file format undefined
86 uint32_t magic() const;
87 void set_magic(uint32_t);
89 cpu_type_t
cputype() const;
90 void set_cputype(cpu_type_t
);
92 cpu_subtype_t
cpusubtype() const;
93 void set_cpusubtype(cpu_subtype_t
);
95 uint32_t filetype() const;
96 void set_filetype(uint32_t);
98 uint32_t ncmds() const;
99 void set_ncmds(uint32_t);
101 uint32_t sizeofcmds() const;
102 void set_sizeofcmds(uint32_t);
104 uint32_t flags() const;
105 void set_flags(uint32_t);
109 #if defined(MACHO_64_SAME_ENDIAN)
110 enum { size
= sizeof(mach_header_64
) };
111 enum { magic_value
= MH_MAGIC_64
};
112 #elif defined(MACHO_64_OPPOSITE_ENDIAN)
113 enum { size
= sizeof(mach_header_64
) };
114 enum { magic_value
= MH_MAGIC_64
};
115 #elif defined(MACHO_32_SAME_ENDIAN)
116 enum { size
= sizeof(mach_header
) };
117 enum { magic_value
= MH_MAGIC
};
118 #elif defined(MACHO_32_OPPOSITE_ENDIAN)
119 enum { size
= sizeof(mach_header
) };
120 enum { magic_value
= MH_MAGIC
};
124 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
125 struct mach_header_64 content
;
127 struct mach_header content
;
130 #define mach_header __my_bad
131 #define mach_header_64 __my_bad
133 inline __attribute__((always_inline
))
134 uint32_t macho_header::magic() const {
135 return ENDIAN_READ32(content
.magic
);
138 inline __attribute__((always_inline
))
139 void macho_header::set_magic(uint32_t _value
) {
140 ENDIAN_WRITE32(content
.magic
, _value
);
143 inline __attribute__((always_inline
))
144 cpu_type_t
macho_header::cputype() const {
145 return ENDIAN_READ32(content
.cputype
);
148 inline __attribute__((always_inline
))
149 void macho_header::set_cputype(cpu_type_t _value
) {
150 ENDIAN_WRITE32(content
.cputype
, _value
);
153 inline __attribute__((always_inline
))
154 cpu_subtype_t
macho_header::cpusubtype() const {
155 return ENDIAN_READ32(content
.cpusubtype
);
158 inline __attribute__((always_inline
))
159 void macho_header::set_cpusubtype(cpu_subtype_t _value
) {
160 ENDIAN_WRITE32(content
.cpusubtype
, _value
);
163 inline __attribute__((always_inline
))
164 uint32_t macho_header::filetype() const {
165 return ENDIAN_READ32(content
.filetype
);
168 inline __attribute__((always_inline
))
169 void macho_header::set_filetype(uint32_t _value
) {
170 ENDIAN_WRITE32(content
.filetype
, _value
);
173 inline __attribute__((always_inline
))
174 uint32_t macho_header::ncmds() const {
175 return ENDIAN_READ32(content
.ncmds
);
178 inline __attribute__((always_inline
))
179 void macho_header::set_ncmds(uint32_t _value
) {
180 ENDIAN_WRITE32(content
.ncmds
, _value
);
183 inline __attribute__((always_inline
))
184 uint32_t macho_header::sizeofcmds() const {
185 return ENDIAN_READ32(content
.sizeofcmds
);
188 inline __attribute__((always_inline
))
189 void macho_header::set_sizeofcmds(uint32_t _value
) {
190 ENDIAN_WRITE32(content
.sizeofcmds
, _value
);
193 inline __attribute__((always_inline
))
194 uint32_t macho_header::flags() const {
195 return ENDIAN_READ32(content
.flags
);
198 inline __attribute__((always_inline
))
199 void macho_header::set_flags(uint32_t _value
) {
200 ENDIAN_WRITE32(content
.flags
, _value
);
203 inline __attribute__((always_inline
))
204 void macho_header::set_reserved() {
205 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
206 content
.reserved
= 0;
212 class macho_load_command
{
214 uint32_t cmd() const;
215 void set_cmd(uint32_t);
217 uint32_t cmdsize() const;
218 void set_cmdsize(uint32_t);
221 struct load_command content
;
224 inline __attribute__((always_inline
))
225 uint32_t macho_load_command::cmd() const {
226 return ENDIAN_READ32(content
.cmd
);
229 inline __attribute__((always_inline
))
230 void macho_load_command::set_cmd(uint32_t _value
) {
231 ENDIAN_WRITE32(content
.cmd
, _value
);
234 inline __attribute__((always_inline
))
235 uint32_t macho_load_command::cmdsize() const {
236 return ENDIAN_READ32(content
.cmdsize
);
239 inline __attribute__((always_inline
))
240 void macho_load_command::set_cmdsize(uint32_t _value
) {
241 ENDIAN_WRITE32(content
.cmdsize
, _value
);
243 #define load_command __my_bad
246 #undef segment_command
247 #undef segment_command_64
248 class macho_segment_command
{
250 uint32_t cmd() const;
251 void set_cmd(uint32_t);
253 uint32_t cmdsize() const;
254 void set_cmdsize(uint32_t);
256 const char* segname() const;
257 void set_segname(const char*);
259 uint64_t vmaddr() const;
260 void set_vmaddr(uint64_t);
262 uint64_t vmsize() const;
263 void set_vmsize(uint64_t);
265 uint64_t fileoff() const;
266 void set_fileoff(uint64_t);
268 uint64_t filesize() const;
269 void set_filesize(uint64_t);
271 vm_prot_t
maxprot() const;
272 void set_maxprot(vm_prot_t
);
274 vm_prot_t
initprot() const;
275 void set_initprot(vm_prot_t
);
277 uint32_t nsects() const;
278 void set_nsects(uint32_t);
280 uint32_t flags() const;
281 void set_flags(uint32_t);
284 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
285 sizeof(segment_command_64
) };
287 sizeof(segment_command
) };
291 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
299 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
300 struct segment_command_64 content
;
302 struct segment_command content
;
305 #define segment_command __my_bad
306 #define segment_command_64 __my_bad
308 inline __attribute__((always_inline
))
309 uint32_t macho_segment_command::cmd() const {
310 return ENDIAN_READ32(content
.cmd
);
313 inline __attribute__((always_inline
))
314 void macho_segment_command::set_cmd(uint32_t _value
) {
315 ENDIAN_WRITE32(content
.cmd
, _value
);
318 inline __attribute__((always_inline
))
319 uint32_t macho_segment_command::cmdsize() const {
320 return ENDIAN_READ32(content
.cmdsize
);
323 inline __attribute__((always_inline
))
324 void macho_segment_command::set_cmdsize(uint32_t _value
) {
325 ENDIAN_WRITE32(content
.cmdsize
, _value
);
328 inline __attribute__((always_inline
))
329 const char* macho_segment_command::segname() const {
330 return content
.segname
;
333 inline __attribute__((always_inline
))
334 void macho_segment_command::set_segname(const char* _value
) {
335 strncpy(content
.segname
, _value
, 16);
338 inline __attribute__((always_inline
))
339 uint64_t macho_segment_command::vmaddr() const {
340 #if defined(ARCH_PPC64)
341 return ENDIAN_SWAP64(content
.vmaddr
);
342 #elif defined(ARCH_PPC) || defined(ARCH_I386)
343 return ENDIAN_READ32(content
.vmaddr
);
345 #error unknown architecture
349 inline __attribute__((always_inline
))
350 void macho_segment_command::set_vmaddr(uint64_t _value
) {
351 #if defined(ARCH_PPC64)
352 content
.vmaddr
= ENDIAN_SWAP64(_value
);
353 #elif defined(ARCH_PPC) || defined(ARCH_I386)
354 ENDIAN_WRITE32(content
.vmaddr
, _value
);
356 #error unknown architecture
360 inline __attribute__((always_inline
))
361 uint64_t macho_segment_command::vmsize() const {
362 #if defined(ARCH_PPC64)
363 return ENDIAN_SWAP64(content
.vmsize
);
364 #elif defined(ARCH_PPC) || defined(ARCH_I386)
365 return ENDIAN_READ32(content
.vmsize
);
367 #error unknown architecture
371 inline __attribute__((always_inline
))
372 void macho_segment_command::set_vmsize(uint64_t _value
) {
373 #if defined(ARCH_PPC64)
374 content
.vmsize
= ENDIAN_SWAP64(_value
);
375 #elif defined(ARCH_PPC) || defined(ARCH_I386)
376 ENDIAN_WRITE32(content
.vmsize
, _value
);
378 #error unknown architecture
382 inline __attribute__((always_inline
))
383 uint64_t macho_segment_command::fileoff() const {
384 #if defined(ARCH_PPC64)
385 return ENDIAN_SWAP64(content
.fileoff
);
386 #elif defined(ARCH_PPC) || defined(ARCH_I386)
387 return ENDIAN_READ32(content
.fileoff
);
389 #error unknown architecture
393 inline __attribute__((always_inline
))
394 void macho_segment_command::set_fileoff(uint64_t _value
) {
395 #if defined(ARCH_PPC64)
396 content
.fileoff
= ENDIAN_SWAP64(_value
);
397 #elif defined(ARCH_PPC) || defined(ARCH_I386)
398 ENDIAN_WRITE32(content
.fileoff
, _value
);
400 #error unknown architecture
404 inline __attribute__((always_inline
))
405 uint64_t macho_segment_command::filesize() const {
406 #if defined(ARCH_PPC64)
407 return ENDIAN_SWAP64(content
.filesize
);
408 #elif defined(ARCH_PPC) || defined(ARCH_I386)
409 return ENDIAN_READ32(content
.filesize
);
411 #error unknown architecture
415 inline __attribute__((always_inline
))
416 void macho_segment_command::set_filesize(uint64_t _value
) {
417 #if defined(ARCH_PPC64)
418 content
.filesize
= ENDIAN_SWAP64(_value
);
419 #elif defined(ARCH_PPC) || defined(ARCH_I386)
420 ENDIAN_WRITE32(content
.filesize
, _value
);
422 #error unknown architecture
426 inline __attribute__((always_inline
))
427 vm_prot_t
macho_segment_command::maxprot() const {
428 return ENDIAN_READ32(content
.maxprot
);
431 inline __attribute__((always_inline
))
432 void macho_segment_command::set_maxprot(vm_prot_t _value
) {
433 ENDIAN_WRITE32(content
.maxprot
, _value
);
436 inline __attribute__((always_inline
))
437 vm_prot_t
macho_segment_command::initprot() const {
438 return ENDIAN_READ32(content
.initprot
);
441 inline __attribute__((always_inline
))
442 void macho_segment_command::set_initprot(vm_prot_t _value
) {
443 ENDIAN_WRITE32(content
.initprot
, _value
);
446 inline __attribute__((always_inline
))
447 uint32_t macho_segment_command::nsects() const {
448 return ENDIAN_READ32(content
.nsects
);
451 inline __attribute__((always_inline
))
452 void macho_segment_command::set_nsects(uint32_t _value
) {
453 ENDIAN_WRITE32(content
.nsects
, _value
);
456 inline __attribute__((always_inline
))
457 uint32_t macho_segment_command::flags() const {
458 return ENDIAN_READ32(content
.flags
);
461 inline __attribute__((always_inline
))
462 void macho_segment_command::set_flags(uint32_t _value
) {
463 ENDIAN_WRITE32(content
.flags
, _value
);
468 class macho_section
{
470 const char* sectname() const;
471 void set_sectname(const char*);
473 const char* segname() const;
474 void set_segname(const char*);
476 uint64_t addr() const;
477 void set_addr(uint64_t);
479 uint64_t size() const;
480 void set_size(uint64_t);
482 uint32_t offset() const;
483 void set_offset(uint32_t);
485 uint32_t align() const;
486 void set_align(uint32_t);
488 uint32_t reloff() const;
489 void set_reloff(uint32_t);
491 uint32_t nreloc() const;
492 void set_nreloc(uint32_t);
494 uint32_t flags() const;
495 void set_flags(uint32_t);
497 uint32_t reserved1() const;
498 void set_reserved1(uint32_t);
500 uint32_t reserved2() const;
501 void set_reserved2(uint32_t);
503 enum { content_size
=
504 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
505 sizeof(section_64
) };
511 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
512 struct section_64 content
;
514 struct section content
;
517 #define section __my_bad
518 #define section_64 __my_bad
520 inline __attribute__((always_inline
))
521 const char* macho_section::sectname() const {
522 return content
.sectname
;
525 inline __attribute__((always_inline
))
526 void macho_section::set_sectname(const char* _value
) {
527 strncpy(content
.sectname
, _value
, 16);
530 inline __attribute__((always_inline
))
531 const char* macho_section::segname() const {
532 return content
.segname
;
535 inline __attribute__((always_inline
))
536 void macho_section::set_segname(const char* _value
) {
537 strncpy(content
.segname
, _value
, 16);
540 inline __attribute__((always_inline
))
541 uint64_t macho_section::addr() const {
542 #if defined(ARCH_PPC64)
543 return ENDIAN_SWAP64(content
.addr
);
544 #elif defined(ARCH_PPC) || defined(ARCH_I386)
545 return ENDIAN_READ32(content
.addr
);
547 #error unknown architecture
551 inline __attribute__((always_inline
))
552 void macho_section::set_addr(uint64_t _value
) {
553 #if defined(ARCH_PPC64)
554 content
.addr
= ENDIAN_SWAP64(_value
);
555 #elif defined(ARCH_PPC) || defined(ARCH_I386)
556 ENDIAN_WRITE32(content
.addr
, _value
);
558 #error unknown architecture
562 inline __attribute__((always_inline
))
563 uint64_t macho_section::size() const {
564 #if defined(ARCH_PPC64)
565 return ENDIAN_SWAP64(content
.size
);
566 #elif defined(ARCH_PPC) || defined(ARCH_I386)
567 return ENDIAN_READ32(content
.size
);
569 #error unknown architecture
573 inline __attribute__((always_inline
))
574 void macho_section::set_size(uint64_t _value
) {
575 #if defined(ARCH_PPC64)
576 content
.size
= ENDIAN_SWAP64(_value
);
577 #elif defined(ARCH_PPC) || defined(ARCH_I386)
578 ENDIAN_WRITE32(content
.size
, _value
);
580 #error unknown architecture
584 inline __attribute__((always_inline
))
585 uint32_t macho_section::offset() const {
586 return ENDIAN_READ32(content
.offset
);
589 inline __attribute__((always_inline
))
590 void macho_section::set_offset(uint32_t _value
) {
591 ENDIAN_WRITE32(content
.offset
, _value
);
594 inline __attribute__((always_inline
))
595 uint32_t macho_section::align() const {
596 return ENDIAN_READ32(content
.align
);
599 inline __attribute__((always_inline
))
600 void macho_section::set_align(uint32_t _value
) {
601 ENDIAN_WRITE32(content
.align
, _value
);
604 inline __attribute__((always_inline
))
605 uint32_t macho_section::reloff() const {
606 return ENDIAN_READ32(content
.reloff
);
609 inline __attribute__((always_inline
))
610 void macho_section::set_reloff(uint32_t _value
) {
611 ENDIAN_WRITE32(content
.reloff
, _value
);
614 inline __attribute__((always_inline
))
615 uint32_t macho_section::nreloc() const {
616 return ENDIAN_READ32(content
.nreloc
);
619 inline __attribute__((always_inline
))
620 void macho_section::set_nreloc(uint32_t _value
) {
621 ENDIAN_WRITE32(content
.nreloc
, _value
);
624 inline __attribute__((always_inline
))
625 uint32_t macho_section::flags() const {
626 return ENDIAN_READ32(content
.flags
);
629 inline __attribute__((always_inline
))
630 void macho_section::set_flags(uint32_t _value
) {
631 ENDIAN_WRITE32(content
.flags
, _value
);
634 inline __attribute__((always_inline
))
635 uint32_t macho_section::reserved1() const {
636 return ENDIAN_READ32(content
.reserved1
);
639 inline __attribute__((always_inline
))
640 void macho_section::set_reserved1(uint32_t _value
) {
641 ENDIAN_WRITE32(content
.reserved1
, _value
);
644 inline __attribute__((always_inline
))
645 uint32_t macho_section::reserved2() const {
646 return ENDIAN_READ32(content
.reserved2
);
649 inline __attribute__((always_inline
))
650 void macho_section::set_reserved2(uint32_t _value
) {
651 ENDIAN_WRITE32(content
.reserved2
, _value
);
655 class macho_dylib_command
{
657 uint32_t cmd() const;
658 void set_cmd(uint32_t);
660 uint32_t cmdsize() const;
661 void set_cmdsize(uint32_t);
663 const char* name() const;
664 void set_name_offset();
666 uint32_t timestamp() const;
667 void set_timestamp(uint32_t);
669 uint32_t current_version() const;
670 void set_current_version(uint32_t);
672 uint32_t compatibility_version() const;
673 void set_compatibility_version(uint32_t);
675 enum { name_offset
= sizeof(struct dylib_command
) };
678 struct dylib_command content
;
680 #define dylib_command __my_bad
682 inline __attribute__((always_inline
))
683 uint32_t macho_dylib_command::cmd() const {
684 return ENDIAN_READ32(content
.cmd
);
687 inline __attribute__((always_inline
))
688 void macho_dylib_command::set_cmd(uint32_t _value
) {
689 ENDIAN_WRITE32(content
.cmd
, _value
);
692 inline __attribute__((always_inline
))
693 uint32_t macho_dylib_command::cmdsize() const {
694 return ENDIAN_READ32(content
.cmdsize
);
697 inline __attribute__((always_inline
))
698 void macho_dylib_command::set_cmdsize(uint32_t _value
) {
699 ENDIAN_WRITE32(content
.cmdsize
, _value
);
702 inline __attribute__((always_inline
))
703 const char* macho_dylib_command::name() const {
704 return (char*)(&content
) + ENDIAN_READ32(content
.dylib
.name
.offset
);
707 inline __attribute__((always_inline
))
708 void macho_dylib_command::set_name_offset() {
709 ENDIAN_WRITE32(content
.dylib
.name
.offset
, name_offset
);
712 inline __attribute__((always_inline
))
713 uint32_t macho_dylib_command::timestamp() const {
714 return ENDIAN_READ32(content
.dylib
.timestamp
);
717 inline __attribute__((always_inline
))
718 void macho_dylib_command::set_timestamp(uint32_t _value
) {
719 ENDIAN_WRITE32(content
.dylib
.timestamp
, _value
);
722 inline __attribute__((always_inline
))
723 uint32_t macho_dylib_command::current_version() const {
724 return ENDIAN_READ32(content
.dylib
.current_version
);
727 inline __attribute__((always_inline
))
728 void macho_dylib_command::set_current_version(uint32_t _value
) {
729 ENDIAN_WRITE32(content
.dylib
.current_version
, _value
);
732 inline __attribute__((always_inline
))
733 uint32_t macho_dylib_command::compatibility_version() const {
734 return ENDIAN_READ32(content
.dylib
.compatibility_version
);
737 inline __attribute__((always_inline
))
738 void macho_dylib_command::set_compatibility_version(uint32_t _value
) {
739 ENDIAN_WRITE32(content
.dylib
.compatibility_version
, _value
);
744 #undef dylinker_command
745 class macho_dylinker_command
{
747 uint32_t cmd() const;
748 void set_cmd(uint32_t);
750 uint32_t cmdsize() const;
751 void set_cmdsize(uint32_t);
753 void set_name_offset();
755 enum { name_offset
= sizeof(struct dylinker_command
) };
758 struct dylinker_command content
;
760 #define dylinker_command __my_bad
762 inline __attribute__((always_inline
))
763 uint32_t macho_dylinker_command::cmd() const {
764 return ENDIAN_READ32(content
.cmd
);
767 inline __attribute__((always_inline
))
768 void macho_dylinker_command::set_cmd(uint32_t _value
) {
769 ENDIAN_WRITE32(content
.cmd
, _value
);
772 inline __attribute__((always_inline
))
773 uint32_t macho_dylinker_command::cmdsize() const {
774 return ENDIAN_READ32(content
.cmdsize
);
777 inline __attribute__((always_inline
))
778 void macho_dylinker_command::set_cmdsize(uint32_t _value
) {
779 ENDIAN_WRITE32(content
.cmdsize
, _value
);
782 inline __attribute__((always_inline
))
783 void macho_dylinker_command::set_name_offset() {
784 ENDIAN_WRITE32(content
.name
.offset
, name_offset
);
789 #undef sub_framework_command
790 class macho_sub_framework_command
{
792 uint32_t cmd() const;
793 void set_cmd(uint32_t);
795 uint32_t cmdsize() const;
796 void set_cmdsize(uint32_t);
798 const char* name() const;
799 void set_name_offset();
801 enum { name_offset
= sizeof(struct sub_framework_command
) };
804 struct sub_framework_command content
;
806 #define sub_framework_command __my_bad
808 inline __attribute__((always_inline
))
809 uint32_t macho_sub_framework_command::cmd() const {
810 return ENDIAN_READ32(content
.cmd
);
813 inline __attribute__((always_inline
))
814 void macho_sub_framework_command::set_cmd(uint32_t _value
) {
815 ENDIAN_WRITE32(content
.cmd
, _value
);
818 inline __attribute__((always_inline
))
819 uint32_t macho_sub_framework_command::cmdsize() const {
820 return ENDIAN_READ32(content
.cmdsize
);
823 inline __attribute__((always_inline
))
824 void macho_sub_framework_command::set_cmdsize(uint32_t _value
) {
825 ENDIAN_WRITE32(content
.cmdsize
, _value
);
828 inline __attribute__((always_inline
))
829 const char* macho_sub_framework_command::name() const {
830 return (char*)(&content
) + ENDIAN_READ32(content
.umbrella
.offset
);
833 inline __attribute__((always_inline
))
834 void macho_sub_framework_command::set_name_offset() {
835 ENDIAN_WRITE32(content
.umbrella
.offset
, name_offset
);
838 #undef sub_client_command
839 class macho_sub_client_command
{
841 uint32_t cmd() const;
842 void set_cmd(uint32_t);
844 uint32_t cmdsize() const;
845 void set_cmdsize(uint32_t);
847 const char* name() const;
848 void set_name_offset();
850 enum { name_offset
= sizeof(struct sub_client_command
) };
852 struct sub_client_command content
;
854 #define sub_client_command __my_bad
856 inline __attribute__((always_inline
))
857 uint32_t macho_sub_client_command::cmd() const {
858 return ENDIAN_READ32(content
.cmd
);
861 inline __attribute__((always_inline
))
862 void macho_sub_client_command::set_cmd(uint32_t _value
) {
863 ENDIAN_WRITE32(content
.cmd
, _value
);
866 inline __attribute__((always_inline
))
867 uint32_t macho_sub_client_command::cmdsize() const {
868 return ENDIAN_READ32(content
.cmdsize
);
871 inline __attribute__((always_inline
))
872 void macho_sub_client_command::set_cmdsize(uint32_t _value
) {
873 ENDIAN_WRITE32(content
.cmdsize
, _value
);
876 inline __attribute__((always_inline
))
877 const char* macho_sub_client_command::name() const {
878 return (char*)(&content
) + ENDIAN_READ32(content
.client
.offset
);
881 inline __attribute__((always_inline
))
882 void macho_sub_client_command::set_name_offset() {
883 ENDIAN_WRITE32(content
.client
.offset
, name_offset
);
888 #undef sub_umbrella_command
889 class macho_sub_umbrella_command
{
891 uint32_t cmd() const;
892 void set_cmd(uint32_t);
894 uint32_t cmdsize() const;
895 void set_cmdsize(uint32_t);
897 const char* name() const;
898 void set_name_offset();
900 enum { name_offset
= sizeof(struct sub_umbrella_command
) };
902 struct sub_umbrella_command content
;
904 #define sub_umbrella_command __my_bad
906 inline __attribute__((always_inline
))
907 uint32_t macho_sub_umbrella_command::cmd() const {
908 return ENDIAN_READ32(content
.cmd
);
911 inline __attribute__((always_inline
))
912 void macho_sub_umbrella_command::set_cmd(uint32_t _value
) {
913 ENDIAN_WRITE32(content
.cmd
, _value
);
916 inline __attribute__((always_inline
))
917 uint32_t macho_sub_umbrella_command::cmdsize() const {
918 return ENDIAN_READ32(content
.cmdsize
);
921 inline __attribute__((always_inline
))
922 void macho_sub_umbrella_command::set_cmdsize(uint32_t _value
) {
923 ENDIAN_WRITE32(content
.cmdsize
, _value
);
926 inline __attribute__((always_inline
))
927 const char* macho_sub_umbrella_command::name() const {
928 return (char*)(&content
) + ENDIAN_READ32(content
.sub_umbrella
.offset
);
931 inline __attribute__((always_inline
))
932 void macho_sub_umbrella_command::set_name_offset() {
933 ENDIAN_WRITE32(content
.sub_umbrella
.offset
, name_offset
);
939 #undef sub_library_command
940 class macho_sub_library_command
{
942 uint32_t cmd() const;
943 void set_cmd(uint32_t);
945 uint32_t cmdsize() const;
946 void set_cmdsize(uint32_t);
948 const char* name() const;
949 void set_name_offset();
951 enum { name_offset
= sizeof(struct sub_library_command
) };
953 struct sub_library_command content
;
955 #define sub_library_command __my_bad
957 inline __attribute__((always_inline
))
958 uint32_t macho_sub_library_command::cmd() const {
959 return ENDIAN_READ32(content
.cmd
);
962 inline __attribute__((always_inline
))
963 void macho_sub_library_command::set_cmd(uint32_t _value
) {
964 ENDIAN_WRITE32(content
.cmd
, _value
);
967 inline __attribute__((always_inline
))
968 uint32_t macho_sub_library_command::cmdsize() const {
969 return ENDIAN_READ32(content
.cmdsize
);
972 inline __attribute__((always_inline
))
973 void macho_sub_library_command::set_cmdsize(uint32_t _value
) {
974 ENDIAN_WRITE32(content
.cmdsize
, _value
);
977 inline __attribute__((always_inline
))
978 const char* macho_sub_library_command::name() const {
979 return (char*)(&content
) + ENDIAN_READ32(content
.sub_library
.offset
);
982 inline __attribute__((always_inline
))
983 void macho_sub_library_command::set_name_offset() {
984 ENDIAN_WRITE32(content
.sub_library
.offset
, name_offset
);
989 #undef routines_command
990 #undef routines_command_64
991 class macho_routines_command
{
993 uint32_t cmd() const;
994 void set_cmd(uint32_t);
996 uint32_t cmdsize() const;
997 void set_cmdsize(uint32_t);
999 uint64_t init_address() const;
1000 void set_init_address(uint64_t);
1002 uint64_t init_module() const;
1003 void set_init_module(uint64_t);
1005 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
1006 enum { size
= sizeof(struct routines_command_64
) };
1007 enum { command
= LC_ROUTINES_64
};
1009 enum { size
= sizeof(struct routines_command
) };
1010 enum { command
= LC_ROUTINES
};
1014 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
1015 struct routines_command_64 content
;
1017 struct routines_command content
;
1020 #define routines_command __my_bad
1021 #define routines_command_64 __my_bad
1023 inline __attribute__((always_inline
))
1024 uint32_t macho_routines_command::cmd() const {
1025 return ENDIAN_READ32(content
.cmd
);
1028 inline __attribute__((always_inline
))
1029 void macho_routines_command::set_cmd(uint32_t _value
) {
1030 ENDIAN_WRITE32(content
.cmd
, _value
);
1033 inline __attribute__((always_inline
))
1034 uint32_t macho_routines_command::cmdsize() const {
1035 return ENDIAN_READ32(content
.cmdsize
);
1038 inline __attribute__((always_inline
))
1039 void macho_routines_command::set_cmdsize(uint32_t _value
) {
1040 ENDIAN_WRITE32(content
.cmdsize
, _value
);
1043 inline __attribute__((always_inline
))
1044 uint64_t macho_routines_command::init_address() const {
1045 #if defined(ARCH_PPC64)
1046 return ENDIAN_SWAP64(content
.init_address
);
1047 #elif defined(ARCH_PPC) || defined(ARCH_I386)
1048 return ENDIAN_READ32(content
.init_address
);
1050 #error unknown architecture
1054 inline __attribute__((always_inline
))
1055 void macho_routines_command::set_init_address(uint64_t _value
) {
1056 #if defined(ARCH_PPC64)
1057 content
.init_address
= ENDIAN_SWAP64(_value
);
1058 #elif defined(ARCH_PPC) || defined(ARCH_I386)
1059 ENDIAN_WRITE32(content
.init_address
, _value
);
1061 #error unknown architecture
1065 inline __attribute__((always_inline
))
1066 uint64_t macho_routines_command::init_module() const {
1067 #if defined(ARCH_PPC64)
1068 return ENDIAN_SWAP64(content
.init_module
);
1069 #elif defined(ARCH_PPC) || defined(ARCH_I386)
1070 return ENDIAN_READ32(content
.init_module
);
1072 #error unknown architecture
1076 inline __attribute__((always_inline
))
1077 void macho_routines_command::set_init_module(uint64_t _value
) {
1078 #if defined(ARCH_PPC64)
1079 content
.init_module
= ENDIAN_SWAP64(_value
);
1080 #elif defined(ARCH_PPC) || defined(ARCH_I386)
1081 ENDIAN_WRITE32(content
.init_module
, _value
);
1083 #error unknown architecture
1089 #undef symtab_command
1090 class macho_symtab_command
{
1092 uint32_t cmd() const;
1093 void set_cmd(uint32_t);
1095 uint32_t cmdsize() const;
1096 void set_cmdsize(uint32_t);
1098 uint32_t symoff() const;
1099 void set_symoff(uint32_t);
1101 uint32_t nsyms() const;
1102 void set_nsyms(uint32_t);
1104 uint32_t stroff() const;
1105 void set_stroff(uint32_t);
1107 uint32_t strsize() const;
1108 void set_strsize(uint32_t);
1110 enum { size
= sizeof(struct symtab_command
) };
1113 struct symtab_command content
;
1115 #define symtab_command __my_bad
1118 inline __attribute__((always_inline
))
1119 uint32_t macho_symtab_command::cmd() const {
1120 return ENDIAN_READ32(content
.cmd
);
1123 inline __attribute__((always_inline
))
1124 void macho_symtab_command::set_cmd(uint32_t _value
) {
1125 ENDIAN_WRITE32(content
.cmd
, _value
);
1128 inline __attribute__((always_inline
))
1129 uint32_t macho_symtab_command::cmdsize() const {
1130 return ENDIAN_READ32(content
.cmdsize
);
1133 inline __attribute__((always_inline
))
1134 void macho_symtab_command::set_cmdsize(uint32_t _value
) {
1135 ENDIAN_WRITE32(content
.cmdsize
, _value
);
1138 inline __attribute__((always_inline
))
1139 uint32_t macho_symtab_command::symoff() const {
1140 return ENDIAN_READ32(content
.symoff
);
1143 inline __attribute__((always_inline
))
1144 void macho_symtab_command::set_symoff(uint32_t _value
) {
1145 ENDIAN_WRITE32(content
.symoff
, _value
);
1148 inline __attribute__((always_inline
))
1149 uint32_t macho_symtab_command::nsyms() const {
1150 return ENDIAN_READ32(content
.nsyms
);
1153 inline __attribute__((always_inline
))
1154 void macho_symtab_command::set_nsyms(uint32_t _value
) {
1155 ENDIAN_WRITE32(content
.nsyms
, _value
);
1158 inline __attribute__((always_inline
))
1159 uint32_t macho_symtab_command::stroff() const {
1160 return ENDIAN_READ32(content
.stroff
);
1163 inline __attribute__((always_inline
))
1164 void macho_symtab_command::set_stroff(uint32_t _value
) {
1165 ENDIAN_WRITE32(content
.stroff
, _value
);
1168 inline __attribute__((always_inline
))
1169 uint32_t macho_symtab_command::strsize() const {
1170 return ENDIAN_READ32(content
.strsize
);
1173 inline __attribute__((always_inline
))
1174 void macho_symtab_command::set_strsize(uint32_t _value
) {
1175 ENDIAN_WRITE32(content
.strsize
, _value
);
1179 #undef dysymtab_command
1180 class macho_dysymtab_command
{
1182 uint32_t cmd() const;
1183 void set_cmd(uint32_t);
1185 uint32_t cmdsize() const;
1186 void set_cmdsize(uint32_t);
1188 uint32_t ilocalsym() const;
1189 void set_ilocalsym(uint32_t);
1191 uint32_t nlocalsym() const;
1192 void set_nlocalsym(uint32_t);
1194 uint32_t iextdefsym() const;
1195 void set_iextdefsym(uint32_t);
1197 uint32_t nextdefsym() const;
1198 void set_nextdefsym(uint32_t);
1200 uint32_t iundefsym() const;
1201 void set_iundefsym(uint32_t);
1203 uint32_t nundefsym() const;
1204 void set_nundefsym(uint32_t);
1206 uint32_t tocoff() const;
1207 void set_tocoff(uint32_t);
1209 uint32_t ntoc() const;
1210 void set_ntoc(uint32_t);
1212 uint32_t modtaboff() const;
1213 void set_modtaboff(uint32_t);
1215 uint32_t nmodtab() const;
1216 void set_nmodtab(uint32_t);
1218 uint32_t extrefsymoff() const;
1219 void set_extrefsymoff(uint32_t);
1221 uint32_t nextrefsyms() const;
1222 void set_nextrefsyms(uint32_t);
1224 uint32_t indirectsymoff() const;
1225 void set_indirectsymoff(uint32_t);
1227 uint32_t nindirectsyms() const;
1228 void set_nindirectsyms(uint32_t);
1230 uint32_t extreloff() const;
1231 void set_extreloff(uint32_t);
1233 uint32_t nextrel() const;
1234 void set_nextrel(uint32_t);
1236 uint32_t locreloff() const;
1237 void set_locreloff(uint32_t);
1239 uint32_t nlocrel() const;
1240 void set_nlocrel(uint32_t);
1242 enum { size
= sizeof(struct dysymtab_command
) };
1244 struct dysymtab_command content
;
1246 #define dysymtab_command __my_bad
1248 inline __attribute__((always_inline
))
1249 uint32_t macho_dysymtab_command::cmd() const {
1250 return ENDIAN_READ32(content
.cmd
);
1253 inline __attribute__((always_inline
))
1254 void macho_dysymtab_command::set_cmd(uint32_t _value
) {
1255 ENDIAN_WRITE32(content
.cmd
, _value
);
1258 inline __attribute__((always_inline
))
1259 uint32_t macho_dysymtab_command::cmdsize() const {
1260 return ENDIAN_READ32(content
.cmdsize
);
1263 inline __attribute__((always_inline
))
1264 void macho_dysymtab_command::set_cmdsize(uint32_t _value
) {
1265 ENDIAN_WRITE32(content
.cmdsize
, _value
);
1268 inline __attribute__((always_inline
))
1269 uint32_t macho_dysymtab_command::ilocalsym() const {
1270 return ENDIAN_READ32(content
.ilocalsym
);
1273 inline __attribute__((always_inline
))
1274 void macho_dysymtab_command::set_ilocalsym(uint32_t _value
) {
1275 ENDIAN_WRITE32(content
.ilocalsym
, _value
);
1278 inline __attribute__((always_inline
))
1279 uint32_t macho_dysymtab_command::nlocalsym() const {
1280 return ENDIAN_READ32(content
.nlocalsym
);
1283 inline __attribute__((always_inline
))
1284 void macho_dysymtab_command::set_nlocalsym(uint32_t _value
) {
1285 ENDIAN_WRITE32(content
.nlocalsym
, _value
);
1288 inline __attribute__((always_inline
))
1289 uint32_t macho_dysymtab_command::iextdefsym() const {
1290 return ENDIAN_READ32(content
.iextdefsym
);
1293 inline __attribute__((always_inline
))
1294 void macho_dysymtab_command::set_iextdefsym(uint32_t _value
) {
1295 ENDIAN_WRITE32(content
.iextdefsym
, _value
);
1298 inline __attribute__((always_inline
))
1299 uint32_t macho_dysymtab_command::nextdefsym() const {
1300 return ENDIAN_READ32(content
.nextdefsym
);
1303 inline __attribute__((always_inline
))
1304 void macho_dysymtab_command::set_nextdefsym(uint32_t _value
) {
1305 ENDIAN_WRITE32(content
.nextdefsym
, _value
);
1308 inline __attribute__((always_inline
))
1309 uint32_t macho_dysymtab_command::iundefsym() const {
1310 return ENDIAN_READ32(content
.iundefsym
);
1313 inline __attribute__((always_inline
))
1314 void macho_dysymtab_command::set_iundefsym(uint32_t _value
) {
1315 ENDIAN_WRITE32(content
.iundefsym
, _value
);
1318 inline __attribute__((always_inline
))
1319 uint32_t macho_dysymtab_command::nundefsym() const {
1320 return ENDIAN_READ32(content
.nundefsym
);
1323 inline __attribute__((always_inline
))
1324 void macho_dysymtab_command::set_nundefsym(uint32_t _value
) {
1325 ENDIAN_WRITE32(content
.nundefsym
, _value
);
1328 inline __attribute__((always_inline
))
1329 uint32_t macho_dysymtab_command::tocoff() const {
1330 return ENDIAN_READ32(content
.tocoff
);
1333 inline __attribute__((always_inline
))
1334 void macho_dysymtab_command::set_tocoff(uint32_t _value
) {
1335 ENDIAN_WRITE32(content
.tocoff
, _value
);
1338 inline __attribute__((always_inline
))
1339 uint32_t macho_dysymtab_command::ntoc() const {
1340 return ENDIAN_READ32(content
.ntoc
);
1343 inline __attribute__((always_inline
))
1344 void macho_dysymtab_command::set_ntoc(uint32_t _value
) {
1345 ENDIAN_WRITE32(content
.ntoc
, _value
);
1348 inline __attribute__((always_inline
))
1349 uint32_t macho_dysymtab_command::modtaboff() const {
1350 return ENDIAN_READ32(content
.modtaboff
);
1353 inline __attribute__((always_inline
))
1354 void macho_dysymtab_command::set_modtaboff(uint32_t _value
) {
1355 ENDIAN_WRITE32(content
.modtaboff
, _value
);
1358 inline __attribute__((always_inline
))
1359 uint32_t macho_dysymtab_command::nmodtab() const {
1360 return ENDIAN_READ32(content
.nmodtab
);
1363 inline __attribute__((always_inline
))
1364 void macho_dysymtab_command::set_nmodtab(uint32_t _value
) {
1365 ENDIAN_WRITE32(content
.nmodtab
, _value
);
1368 inline __attribute__((always_inline
))
1369 uint32_t macho_dysymtab_command::extrefsymoff() const {
1370 return ENDIAN_READ32(content
.extrefsymoff
);
1373 inline __attribute__((always_inline
))
1374 void macho_dysymtab_command::set_extrefsymoff(uint32_t _value
) {
1375 ENDIAN_WRITE32(content
.extrefsymoff
, _value
);
1378 inline __attribute__((always_inline
))
1379 uint32_t macho_dysymtab_command::nextrefsyms() const {
1380 return ENDIAN_READ32(content
.nextrefsyms
);
1383 inline __attribute__((always_inline
))
1384 void macho_dysymtab_command::set_nextrefsyms(uint32_t _value
) {
1385 ENDIAN_WRITE32(content
.nextrefsyms
, _value
);
1388 inline __attribute__((always_inline
))
1389 uint32_t macho_dysymtab_command::indirectsymoff() const {
1390 return ENDIAN_READ32(content
.indirectsymoff
);
1393 inline __attribute__((always_inline
))
1394 void macho_dysymtab_command::set_indirectsymoff(uint32_t _value
) {
1395 ENDIAN_WRITE32(content
.indirectsymoff
, _value
);
1398 inline __attribute__((always_inline
))
1399 uint32_t macho_dysymtab_command::nindirectsyms() const {
1400 return ENDIAN_READ32(content
.nindirectsyms
);
1403 inline __attribute__((always_inline
))
1404 void macho_dysymtab_command::set_nindirectsyms(uint32_t _value
) {
1405 ENDIAN_WRITE32(content
.nindirectsyms
, _value
);
1408 inline __attribute__((always_inline
))
1409 uint32_t macho_dysymtab_command::extreloff() const {
1410 return ENDIAN_READ32(content
.extreloff
);
1413 inline __attribute__((always_inline
))
1414 void macho_dysymtab_command::set_extreloff(uint32_t _value
) {
1415 ENDIAN_WRITE32(content
.extreloff
, _value
);
1418 inline __attribute__((always_inline
))
1419 uint32_t macho_dysymtab_command::nextrel() const {
1420 return ENDIAN_READ32(content
.nextrel
);
1423 inline __attribute__((always_inline
))
1424 void macho_dysymtab_command::set_nextrel(uint32_t _value
) {
1425 ENDIAN_WRITE32(content
.nextrel
, _value
);
1428 inline __attribute__((always_inline
))
1429 uint32_t macho_dysymtab_command::locreloff() const {
1430 return ENDIAN_READ32(content
.locreloff
);
1433 inline __attribute__((always_inline
))
1434 void macho_dysymtab_command::set_locreloff(uint32_t _value
) {
1435 ENDIAN_WRITE32(content
.locreloff
, _value
);
1438 inline __attribute__((always_inline
))
1439 uint32_t macho_dysymtab_command::nlocrel() const {
1440 return ENDIAN_READ32(content
.nlocrel
);
1443 inline __attribute__((always_inline
))
1444 void macho_dysymtab_command::set_nlocrel(uint32_t _value
) {
1445 ENDIAN_WRITE32(content
.nlocrel
, _value
);
1450 #undef twolevel_hints_command
1451 class macho_twolevel_hints_command
{
1453 uint32_t cmd() const;
1454 void set_cmd(uint32_t);
1456 uint32_t cmdsize() const;
1457 void set_cmdsize(uint32_t);
1459 uint32_t offset() const;
1460 void set_offset(uint32_t);
1462 uint32_t nhints() const;
1463 void set_nhints(uint32_t);
1466 struct twolevel_hints_command content
;
1468 #define twolevel_hints_command __my_bad
1470 inline __attribute__((always_inline
))
1471 uint32_t macho_twolevel_hints_command::cmd() const {
1472 return ENDIAN_READ32(content
.cmd
);
1475 inline __attribute__((always_inline
))
1476 void macho_twolevel_hints_command::set_cmd(uint32_t _value
) {
1477 ENDIAN_WRITE32(content
.cmd
, _value
);
1480 inline __attribute__((always_inline
))
1481 uint32_t macho_twolevel_hints_command::cmdsize() const {
1482 return ENDIAN_READ32(content
.cmdsize
);
1485 inline __attribute__((always_inline
))
1486 void macho_twolevel_hints_command::set_cmdsize(uint32_t _value
) {
1487 ENDIAN_WRITE32(content
.cmdsize
, _value
);
1490 inline __attribute__((always_inline
))
1491 uint32_t macho_twolevel_hints_command::offset() const {
1492 return ENDIAN_READ32(content
.offset
);
1495 inline __attribute__((always_inline
))
1496 void macho_twolevel_hints_command::set_offset(uint32_t _value
) {
1497 ENDIAN_WRITE32(content
.offset
, _value
);
1500 inline __attribute__((always_inline
))
1501 uint32_t macho_twolevel_hints_command::nhints() const {
1502 return ENDIAN_READ32(content
.nhints
);
1505 inline __attribute__((always_inline
))
1506 void macho_twolevel_hints_command::set_nhints(uint32_t _value
) {
1507 ENDIAN_WRITE32(content
.nhints
, _value
);
1511 #undef thread_command
1512 class macho_thread_command
{
1514 uint32_t cmd() const;
1515 void set_cmd(uint32_t);
1517 uint32_t cmdsize() const;
1518 void set_cmdsize(uint32_t);
1520 uint32_t flavor() const;
1521 void set_flavor(uint32_t);
1523 uint32_t count() const;
1524 void set_count(uint32_t);
1526 uint32_t threadState32(uint32_t index
) const;
1527 void set_threadState32(uint32_t index
, uint32_t value
);
1529 uint64_t threadState64(uint32_t offset
) const;
1530 void set_threadState64(uint32_t index
, uint64_t value
);
1532 enum { size
= sizeof(struct thread_command
) + 8 };
1535 struct thread_command content
;
1536 uint32_t content_flavor
;
1537 uint32_t content_count
;
1538 uint32_t threadState
[1];
1540 #define thread_command __my_bad
1542 inline __attribute__((always_inline
))
1543 uint32_t macho_thread_command::cmd() const {
1544 return ENDIAN_READ32(content
.cmd
);
1547 inline __attribute__((always_inline
))
1548 void macho_thread_command::set_cmd(uint32_t _value
) {
1549 ENDIAN_WRITE32(content
.cmd
, _value
);
1552 inline __attribute__((always_inline
))
1553 uint32_t macho_thread_command::cmdsize() const {
1554 return ENDIAN_READ32(content
.cmdsize
);
1557 inline __attribute__((always_inline
))
1558 void macho_thread_command::set_cmdsize(uint32_t _value
) {
1559 ENDIAN_WRITE32(content
.cmdsize
, _value
);
1562 inline __attribute__((always_inline
))
1563 uint32_t macho_thread_command::flavor() const {
1564 return ENDIAN_READ32(content_flavor
);
1567 inline __attribute__((always_inline
))
1568 void macho_thread_command::set_flavor(uint32_t _value
) {
1569 ENDIAN_WRITE32(content_flavor
, _value
);
1572 inline __attribute__((always_inline
))
1573 uint32_t macho_thread_command::count() const {
1574 return ENDIAN_READ32(content_count
);
1577 inline __attribute__((always_inline
))
1578 void macho_thread_command::set_count(uint32_t _value
) {
1579 ENDIAN_WRITE32(content_count
, _value
);
1582 inline __attribute__((always_inline
))
1583 uint32_t macho_thread_command::threadState32(uint32_t index
) const
1585 return ENDIAN_READ32(threadState
[index
]);
1588 inline __attribute__((always_inline
))
1589 void macho_thread_command::set_threadState32(uint32_t index
, uint32_t _value
)
1591 ENDIAN_WRITE32(threadState
[index
], _value
);
1594 inline __attribute__((always_inline
))
1595 uint64_t macho_thread_command::threadState64(uint32_t index
) const
1597 uint64_t temp
= *((uint64_t*)(&threadState
[index
]));
1598 return ENDIAN_SWAP64(temp
);
1601 inline __attribute__((always_inline
))
1602 void macho_thread_command::set_threadState64(uint32_t index
, uint64_t _value
)
1604 *((uint64_t*)(&threadState
[index
])) = ENDIAN_SWAP64(_value
);
1613 uint32_t n_strx() const;
1614 void set_n_strx(uint32_t);
1616 uint8_t n_type() const;
1617 void set_n_type(uint8_t);
1619 uint8_t n_sect() const;
1620 void set_n_sect(uint8_t);
1622 uint16_t n_desc() const;
1623 void set_n_desc(uint16_t);
1625 uint64_t n_value() const;
1626 void set_n_value(uint64_t);
1629 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
1630 enum { size
= sizeof(struct nlist_64
) };
1632 enum { size
= sizeof(struct nlist
) };
1636 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
1637 struct nlist_64 content
;
1639 struct nlist content
;
1642 #define nlist __my_bad
1643 #define nlist_64 __my_bad
1645 inline __attribute__((always_inline
))
1646 uint32_t macho_nlist::n_strx() const {
1647 return ENDIAN_READ32(content
.n_un
.n_strx
);
1650 inline __attribute__((always_inline
))
1651 void macho_nlist::set_n_strx(uint32_t _value
) {
1652 ENDIAN_WRITE32(content
.n_un
.n_strx
, _value
);
1655 inline __attribute__((always_inline
))
1656 uint8_t macho_nlist::n_type() const {
1657 return content
.n_type
;
1660 inline __attribute__((always_inline
))
1661 void macho_nlist::set_n_type(uint8_t _value
) {
1662 content
.n_type
= _value
;
1665 inline __attribute__((always_inline
))
1666 uint8_t macho_nlist::n_sect() const {
1667 return content
.n_sect
;
1670 inline __attribute__((always_inline
))
1671 void macho_nlist::set_n_sect(uint8_t _value
) {
1672 content
.n_sect
= _value
;
1675 inline __attribute__((always_inline
))
1676 uint16_t macho_nlist::n_desc() const {
1677 return ENDIAN_READ16(content
.n_desc
);
1680 inline __attribute__((always_inline
))
1681 void macho_nlist::set_n_desc(uint16_t _value
) {
1682 ENDIAN_WRITE16(content
.n_desc
, _value
);
1685 inline __attribute__((always_inline
))
1686 uint64_t macho_nlist::n_value() const {
1687 #if defined(ARCH_PPC64)
1688 return ENDIAN_SWAP64(content
.n_value
);
1689 #elif defined(ARCH_PPC) || defined(ARCH_I386)
1690 return ENDIAN_READ32(content
.n_value
);
1692 #error unknown architecture
1696 inline __attribute__((always_inline
))
1697 void macho_nlist::set_n_value(uint64_t _value
) {
1698 #if defined(ARCH_PPC64)
1699 content
.n_value
= ENDIAN_SWAP64(_value
);
1700 #elif defined(ARCH_PPC) || defined(ARCH_I386)
1701 ENDIAN_WRITE32(content
.n_value
, _value
);
1703 #error unknown architecture
1709 #undef relocation_info
1710 class macho_relocation_info
{
1712 int32_t r_address() const;
1713 void set_r_address(int32_t);
1715 uint32_t r_symbolnum() const;
1716 void set_r_symbolnum(uint32_t);
1718 bool r_pcrel() const;
1719 void set_r_pcrel(bool);
1721 uint8_t r_length() const;
1722 void set_r_length(uint8_t);
1724 bool r_extern() const;
1725 void set_r_extern(bool);
1727 uint8_t r_type() const;
1728 void set_r_type(uint8_t);
1730 enum { size
= sizeof(struct relocation_info
) };
1731 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
1732 enum { pointer_length
= 3 };
1734 enum { pointer_length
= 2 };
1738 struct relocation_info content
;
1740 #define relocation_info __my_bad
1743 inline __attribute__((always_inline
))
1744 int32_t macho_relocation_info::r_address() const {
1745 return ENDIAN_READ32(content
.r_address
);
1748 inline __attribute__((always_inline
))
1749 void macho_relocation_info::set_r_address(int32_t _value
) {
1750 ENDIAN_WRITE32(content
.r_address
, _value
);
1753 inline __attribute__((always_inline
))
1754 uint32_t macho_relocation_info::r_symbolnum() const {
1755 uint32_t temp
= ENDIAN_READ32(((const uint32_t*)&content
)[1]);
1756 #if defined(ARCH_PPC) || defined(ARCH_PPC64)
1758 #elif defined(ARCH_I386)
1759 return temp
& 0x00FFFFFF;
1761 #error unknown architecture
1765 inline __attribute__((always_inline
))
1766 void macho_relocation_info::set_r_symbolnum(uint32_t _value
) {
1767 uint32_t temp
= ENDIAN_READ32(((const uint32_t*)&content
)[1]);
1768 #if defined(ARCH_PPC) || defined(ARCH_PPC64)
1770 temp
|= ((_value
& 0x00FFFFFF) << 8);
1771 #elif defined(ARCH_I386)
1773 temp
|= (_value
& 0x00FFFFFF);
1775 #error unknown architecture
1777 ENDIAN_WRITE32(((uint32_t*)&content
)[1], temp
);
1780 inline __attribute__((always_inline
))
1781 bool macho_relocation_info::r_pcrel() const {
1782 uint32_t temp
= ENDIAN_READ32(((const uint32_t*)&content
)[1]);
1783 #if defined(ARCH_PPC) || defined(ARCH_PPC64)
1784 return ((temp
& 0x00000080) != 0);
1785 #elif defined(ARCH_I386)
1786 return ((temp
& 0x01000000) != 0);
1788 #error unknown architecture
1792 inline __attribute__((always_inline
))
1793 void macho_relocation_info::set_r_pcrel(bool _value
) {
1794 uint32_t temp
= ENDIAN_READ32(((const uint32_t*)&content
)[1]);
1795 #if defined(ARCH_PPC) || defined(ARCH_PPC64)
1799 #elif defined(ARCH_I386)
1804 #error unknown architecture
1806 ENDIAN_WRITE32(((uint32_t*)&content
)[1], temp
);
1809 inline __attribute__((always_inline
))
1810 uint8_t macho_relocation_info::r_length() const {
1811 uint32_t temp
= ENDIAN_READ32(((const uint32_t*)&content
)[1]);
1812 #if defined(ARCH_PPC) || defined(ARCH_PPC64)
1813 return ((temp
& 0x00000060) >> 5);
1814 #elif defined(ARCH_I386)
1815 return ((temp
& 0x06000000) >> 25);
1817 #error unknown architecture
1821 inline __attribute__((always_inline
))
1822 void macho_relocation_info::set_r_length(uint8_t _value
) {
1823 uint32_t temp
= ENDIAN_READ32(((const uint32_t*)&content
)[1]);
1824 #if defined(ARCH_PPC) || defined(ARCH_PPC64)
1826 temp
|= ((_value
& 0x03) << 5);
1827 #elif defined(ARCH_I386)
1829 temp
|= ((_value
& 0x03) << 25);
1831 #error unknown architecture
1833 ENDIAN_WRITE32(((uint32_t*)&content
)[1], temp
);
1836 inline __attribute__((always_inline
))
1837 bool macho_relocation_info::r_extern() const {
1838 uint32_t temp
= ENDIAN_READ32(((const uint32_t*)&content
)[1]);
1839 #if defined(ARCH_PPC) || defined(ARCH_PPC64)
1840 return ((temp
& 0x00000010) != 0);
1841 #elif defined(ARCH_I386)
1842 return ((temp
& 0x08000000) != 0);
1844 #error unknown architecture
1848 inline __attribute__((always_inline
))
1849 void macho_relocation_info::set_r_extern(bool _value
) {
1850 uint32_t temp
= ENDIAN_READ32(((const uint32_t*)&content
)[1]);
1851 #if defined(ARCH_PPC) || defined(ARCH_PPC64)
1855 #elif defined(ARCH_I386)
1860 #error unknown architecture
1862 ENDIAN_WRITE32(((uint32_t*)&content
)[1], temp
);
1865 inline __attribute__((always_inline
))
1866 uint8_t macho_relocation_info::r_type() const {
1867 uint32_t temp
= ENDIAN_READ32(((const uint32_t*)&content
)[1]);
1868 #if defined(ARCH_PPC) || defined(ARCH_PPC64)
1869 return (temp
& 0x0000000F);
1870 #elif defined(ARCH_I386)
1871 return ((temp
& 0xF0000000) >> 28);
1873 #error unknown architecture
1877 inline __attribute__((always_inline
))
1878 void macho_relocation_info::set_r_type(uint8_t _value
) {
1879 uint32_t temp
= ENDIAN_READ32(((const uint32_t*)&content
)[1]);
1880 #if defined(ARCH_PPC) || defined(ARCH_PPC64)
1882 temp
|= (_value
& 0x0F);
1883 #elif defined(ARCH_I386)
1885 temp
|= ((_value
& 0x0F) << 28);
1887 #error unknown architecture
1889 ENDIAN_WRITE32(((uint32_t*)&content
)[1], temp
);
1894 #undef scattered_relocation_info
1895 class macho_scattered_relocation_info
{
1897 bool r_scattered() const;
1898 void set_r_scattered(bool);
1900 bool r_pcrel() const;
1901 void set_r_pcrel(bool);
1903 uint8_t r_length() const;
1904 void set_r_length(uint8_t);
1906 uint8_t r_type() const;
1907 void set_r_type(uint8_t);
1909 uint32_t r_address() const;
1910 void set_r_address(uint32_t);
1912 int32_t r_value() const;
1913 void set_r_value(int32_t);
1916 struct scattered_relocation_info content
;
1918 #define scattered_relocation_info __my_bad
1920 inline __attribute__((always_inline
))
1921 bool macho_scattered_relocation_info::r_scattered() const {
1922 uint32_t temp
= *((const uint32_t*)&content
);
1923 temp
= ENDIAN_READ32(temp
);
1924 return ((temp
& 0x80000000) != 0);
1927 inline __attribute__((always_inline
))
1928 void macho_scattered_relocation_info::set_r_scattered(bool _value
) {
1929 uint32_t temp
= ENDIAN_READ32(*((const uint32_t*)&content
));
1933 temp
&= ~0x80000000;
1934 ENDIAN_WRITE32(*((uint32_t*)&content
), temp
);
1937 inline __attribute__((always_inline
))
1938 bool macho_scattered_relocation_info::r_pcrel() const {
1939 uint32_t temp
= *((const uint32_t*)&content
);
1940 temp
= ENDIAN_READ32(temp
);
1941 return ((temp
& 0x40000000) != 0);
1944 inline __attribute__((always_inline
))
1945 void macho_scattered_relocation_info::set_r_pcrel(bool _value
) {
1946 uint32_t temp
= ENDIAN_READ32(*((const uint32_t*)&content
));
1950 temp
&= ~0x40000000;
1951 ENDIAN_WRITE32(*((uint32_t*)&content
), temp
);
1954 inline __attribute__((always_inline
))
1955 uint8_t macho_scattered_relocation_info::r_length() const {
1956 uint32_t temp
= ENDIAN_READ32(*((const uint32_t*)&content
));
1957 return (temp
>> 28) & 0x03;
1960 inline __attribute__((always_inline
))
1961 void macho_scattered_relocation_info::set_r_length(uint8_t _value
) {
1962 uint32_t temp
= ENDIAN_READ32(*((const uint32_t*)&content
));
1964 temp
|= ((_value
& 0x03) << 28);
1965 ENDIAN_WRITE32(*((uint32_t*)&content
), temp
);
1968 inline __attribute__((always_inline
))
1969 uint8_t macho_scattered_relocation_info::r_type() const {
1970 uint32_t temp
= ENDIAN_READ32(*((const uint32_t*)&content
));
1971 return (temp
>> 24) & 0x0F;
1974 inline __attribute__((always_inline
))
1975 void macho_scattered_relocation_info::set_r_type(uint8_t _value
) {
1976 uint32_t temp
= ENDIAN_READ32(*((const uint32_t*)&content
));
1978 temp
|= ((_value
&0x0F) << 24);
1979 ENDIAN_WRITE32(*((uint32_t*)&content
), temp
);
1982 inline __attribute__((always_inline
))
1983 uint32_t macho_scattered_relocation_info::r_address() const {
1984 uint32_t temp
= ENDIAN_READ32(*((const uint32_t*)&content
));
1985 return temp
& 0x00FFFFFF;
1988 inline __attribute__((always_inline
))
1989 void macho_scattered_relocation_info::set_r_address(uint32_t _value
) {
1990 uint32_t temp
= ENDIAN_READ32(*((const uint32_t*)&content
));
1991 _value
&= 0x00FFFFFF;
1994 ENDIAN_WRITE32(*((uint32_t*)&content
), temp
);
1997 inline __attribute__((always_inline
))
1998 int32_t macho_scattered_relocation_info::r_value() const {
1999 return ENDIAN_READ32(content
.r_value
);
2002 inline __attribute__((always_inline
))
2003 void macho_scattered_relocation_info::set_r_value(int32_t _value
) {
2004 ENDIAN_WRITE32(content
.r_value
, _value
);