2 * Copyright (c) 2005 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
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
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.
21 * @APPLE_LICENSE_HEADER_END@
25 #include <mach-o/nlist.h>
26 #include <mach-o/loader.h>
27 #include <libkern/OSByteOrder.h>
35 #undef ENDIAN_SWAP_POINTER
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);
41 #define ENDIAN_READ32(x) (x)
42 #define ENDIAN_WRITE32(into, value) into = (value);
44 #define ENDIAN_SWAP64(x) (x)
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);
50 #define ENDIAN_READ32(x) OSReadSwapInt32((uint32_t*)&(x), 0)
51 #define ENDIAN_WRITE32(into, value) OSWriteSwapInt32(&(into), 0, value);
53 #define ENDIAN_SWAP64(x) OSSwapInt64(x)
56 #error file format undefined
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
;
64 typedef uint32_t macho_uintptr_t
;
65 typedef int32_t macho_intptr_t
;
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)
77 #error file format undefined
85 uint32_t magic() const;
86 void set_magic(uint32_t);
88 cpu_type_t
cputype() const;
89 void set_cputype(cpu_type_t
);
91 cpu_subtype_t
cpusubtype() const;
92 void set_cpusubtype(cpu_subtype_t
);
94 uint32_t filetype() const;
95 void set_filetype(uint32_t);
97 uint32_t ncmds() const;
98 void set_ncmds(uint32_t);
100 uint32_t sizeofcmds() const;
101 void set_sizeofcmds(uint32_t);
103 uint32_t flags() const;
104 void set_flags(uint32_t);
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
};
123 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
124 struct mach_header_64 content
;
126 struct mach_header content
;
129 #define mach_header __my_bad
130 #define mach_header_64 __my_bad
132 inline __attribute__((always_inline
))
133 uint32_t macho_header::magic() const {
134 return ENDIAN_READ32(content
.magic
);
137 inline __attribute__((always_inline
))
138 void macho_header::set_magic(uint32_t _value
) {
139 ENDIAN_WRITE32(content
.magic
, _value
);
142 inline __attribute__((always_inline
))
143 cpu_type_t
macho_header::cputype() const {
144 return ENDIAN_READ32(content
.cputype
);
147 inline __attribute__((always_inline
))
148 void macho_header::set_cputype(cpu_type_t _value
) {
149 ENDIAN_WRITE32(content
.cputype
, _value
);
152 inline __attribute__((always_inline
))
153 cpu_subtype_t
macho_header::cpusubtype() const {
154 return ENDIAN_READ32(content
.cpusubtype
);
157 inline __attribute__((always_inline
))
158 void macho_header::set_cpusubtype(cpu_subtype_t _value
) {
159 ENDIAN_WRITE32(content
.cpusubtype
, _value
);
162 inline __attribute__((always_inline
))
163 uint32_t macho_header::filetype() const {
164 return ENDIAN_READ32(content
.filetype
);
167 inline __attribute__((always_inline
))
168 void macho_header::set_filetype(uint32_t _value
) {
169 ENDIAN_WRITE32(content
.filetype
, _value
);
172 inline __attribute__((always_inline
))
173 uint32_t macho_header::ncmds() const {
174 return ENDIAN_READ32(content
.ncmds
);
177 inline __attribute__((always_inline
))
178 void macho_header::set_ncmds(uint32_t _value
) {
179 ENDIAN_WRITE32(content
.ncmds
, _value
);
182 inline __attribute__((always_inline
))
183 uint32_t macho_header::sizeofcmds() const {
184 return ENDIAN_READ32(content
.sizeofcmds
);
187 inline __attribute__((always_inline
))
188 void macho_header::set_sizeofcmds(uint32_t _value
) {
189 ENDIAN_WRITE32(content
.sizeofcmds
, _value
);
192 inline __attribute__((always_inline
))
193 uint32_t macho_header::flags() const {
194 return ENDIAN_READ32(content
.flags
);
197 inline __attribute__((always_inline
))
198 void macho_header::set_flags(uint32_t _value
) {
199 ENDIAN_WRITE32(content
.flags
, _value
);
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;
211 class macho_load_command
{
213 uint32_t cmd() const;
214 void set_cmd(uint32_t);
216 uint32_t cmdsize() const;
217 void set_cmdsize(uint32_t);
220 struct load_command content
;
223 inline __attribute__((always_inline
))
224 uint32_t macho_load_command::cmd() const {
225 return ENDIAN_READ32(content
.cmd
);
228 inline __attribute__((always_inline
))
229 void macho_load_command::set_cmd(uint32_t _value
) {
230 ENDIAN_WRITE32(content
.cmd
, _value
);
233 inline __attribute__((always_inline
))
234 uint32_t macho_load_command::cmdsize() const {
235 return ENDIAN_READ32(content
.cmdsize
);
238 inline __attribute__((always_inline
))
239 void macho_load_command::set_cmdsize(uint32_t _value
) {
240 ENDIAN_WRITE32(content
.cmdsize
, _value
);
242 #define load_command __my_bad
245 #undef segment_command
246 #undef segment_command_64
247 class macho_segment_command
{
249 uint32_t cmd() const;
250 void set_cmd(uint32_t);
252 uint32_t cmdsize() const;
253 void set_cmdsize(uint32_t);
255 const char* segname() const;
256 void set_segname(const char*);
258 uint64_t vmaddr() const;
259 void set_vmaddr(uint64_t);
261 uint64_t vmsize() const;
262 void set_vmsize(uint64_t);
264 uint64_t fileoff() const;
265 void set_fileoff(uint64_t);
267 uint64_t filesize() const;
268 void set_filesize(uint64_t);
270 vm_prot_t
maxprot() const;
271 void set_maxprot(vm_prot_t
);
273 vm_prot_t
initprot() const;
274 void set_initprot(vm_prot_t
);
276 uint32_t nsects() const;
277 void set_nsects(uint32_t);
279 uint32_t flags() const;
280 void set_flags(uint32_t);
283 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
284 sizeof(segment_command_64
) };
286 sizeof(segment_command
) };
290 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
298 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
299 struct segment_command_64 content
;
301 struct segment_command content
;
304 #define segment_command __my_bad
305 #define segment_command_64 __my_bad
307 inline __attribute__((always_inline
))
308 uint32_t macho_segment_command::cmd() const {
309 return ENDIAN_READ32(content
.cmd
);
312 inline __attribute__((always_inline
))
313 void macho_segment_command::set_cmd(uint32_t _value
) {
314 ENDIAN_WRITE32(content
.cmd
, _value
);
317 inline __attribute__((always_inline
))
318 uint32_t macho_segment_command::cmdsize() const {
319 return ENDIAN_READ32(content
.cmdsize
);
322 inline __attribute__((always_inline
))
323 void macho_segment_command::set_cmdsize(uint32_t _value
) {
324 ENDIAN_WRITE32(content
.cmdsize
, _value
);
327 inline __attribute__((always_inline
))
328 const char* macho_segment_command::segname() const {
329 return content
.segname
;
332 inline __attribute__((always_inline
))
333 void macho_segment_command::set_segname(const char* _value
) {
334 strncpy(content
.segname
, _value
, 16);
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
);
344 #error unknown architecture
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
);
355 #error unknown architecture
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
);
366 #error unknown architecture
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
);
377 #error unknown architecture
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
);
388 #error unknown architecture
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
);
399 #error unknown architecture
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
);
410 #error unknown architecture
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
);
421 #error unknown architecture
425 inline __attribute__((always_inline
))
426 vm_prot_t
macho_segment_command::maxprot() const {
427 return ENDIAN_READ32(content
.maxprot
);
430 inline __attribute__((always_inline
))
431 void macho_segment_command::set_maxprot(vm_prot_t _value
) {
432 ENDIAN_WRITE32(content
.maxprot
, _value
);
435 inline __attribute__((always_inline
))
436 vm_prot_t
macho_segment_command::initprot() const {
437 return ENDIAN_READ32(content
.initprot
);
440 inline __attribute__((always_inline
))
441 void macho_segment_command::set_initprot(vm_prot_t _value
) {
442 ENDIAN_WRITE32(content
.initprot
, _value
);
445 inline __attribute__((always_inline
))
446 uint32_t macho_segment_command::nsects() const {
447 return ENDIAN_READ32(content
.nsects
);
450 inline __attribute__((always_inline
))
451 void macho_segment_command::set_nsects(uint32_t _value
) {
452 ENDIAN_WRITE32(content
.nsects
, _value
);
455 inline __attribute__((always_inline
))
456 uint32_t macho_segment_command::flags() const {
457 return ENDIAN_READ32(content
.flags
);
460 inline __attribute__((always_inline
))
461 void macho_segment_command::set_flags(uint32_t _value
) {
462 ENDIAN_WRITE32(content
.flags
, _value
);
467 class macho_section
{
469 const char* sectname() const;
470 void set_sectname(const char*);
472 const char* segname() const;
473 void set_segname(const char*);
475 uint64_t addr() const;
476 void set_addr(uint64_t);
478 uint64_t size() const;
479 void set_size(uint64_t);
481 uint32_t offset() const;
482 void set_offset(uint32_t);
484 uint32_t align() const;
485 void set_align(uint32_t);
487 uint32_t reloff() const;
488 void set_reloff(uint32_t);
490 uint32_t nreloc() const;
491 void set_nreloc(uint32_t);
493 uint32_t flags() const;
494 void set_flags(uint32_t);
496 uint32_t reserved1() const;
497 void set_reserved1(uint32_t);
499 uint32_t reserved2() const;
500 void set_reserved2(uint32_t);
502 enum { content_size
=
503 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
504 sizeof(section_64
) };
510 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
511 struct section_64 content
;
513 struct section content
;
516 #define section __my_bad
517 #define section_64 __my_bad
519 inline __attribute__((always_inline
))
520 const char* macho_section::sectname() const {
521 return content
.sectname
;
524 inline __attribute__((always_inline
))
525 void macho_section::set_sectname(const char* _value
) {
526 strncpy(content
.sectname
, _value
, 16);
529 inline __attribute__((always_inline
))
530 const char* macho_section::segname() const {
531 return content
.segname
;
534 inline __attribute__((always_inline
))
535 void macho_section::set_segname(const char* _value
) {
536 strncpy(content
.segname
, _value
, 16);
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
);
546 #error unknown architecture
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
);
557 #error unknown architecture
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
);
568 #error unknown architecture
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
);
579 #error unknown architecture
583 inline __attribute__((always_inline
))
584 uint32_t macho_section::offset() const {
585 return ENDIAN_READ32(content
.offset
);
588 inline __attribute__((always_inline
))
589 void macho_section::set_offset(uint32_t _value
) {
590 ENDIAN_WRITE32(content
.offset
, _value
);
593 inline __attribute__((always_inline
))
594 uint32_t macho_section::align() const {
595 return ENDIAN_READ32(content
.align
);
598 inline __attribute__((always_inline
))
599 void macho_section::set_align(uint32_t _value
) {
600 ENDIAN_WRITE32(content
.align
, _value
);
603 inline __attribute__((always_inline
))
604 uint32_t macho_section::reloff() const {
605 return ENDIAN_READ32(content
.reloff
);
608 inline __attribute__((always_inline
))
609 void macho_section::set_reloff(uint32_t _value
) {
610 ENDIAN_WRITE32(content
.reloff
, _value
);
613 inline __attribute__((always_inline
))
614 uint32_t macho_section::nreloc() const {
615 return ENDIAN_READ32(content
.nreloc
);
618 inline __attribute__((always_inline
))
619 void macho_section::set_nreloc(uint32_t _value
) {
620 ENDIAN_WRITE32(content
.nreloc
, _value
);
623 inline __attribute__((always_inline
))
624 uint32_t macho_section::flags() const {
625 return ENDIAN_READ32(content
.flags
);
628 inline __attribute__((always_inline
))
629 void macho_section::set_flags(uint32_t _value
) {
630 ENDIAN_WRITE32(content
.flags
, _value
);
633 inline __attribute__((always_inline
))
634 uint32_t macho_section::reserved1() const {
635 return ENDIAN_READ32(content
.reserved1
);
638 inline __attribute__((always_inline
))
639 void macho_section::set_reserved1(uint32_t _value
) {
640 ENDIAN_WRITE32(content
.reserved1
, _value
);
643 inline __attribute__((always_inline
))
644 uint32_t macho_section::reserved2() const {
645 return ENDIAN_READ32(content
.reserved2
);
648 inline __attribute__((always_inline
))
649 void macho_section::set_reserved2(uint32_t _value
) {
650 ENDIAN_WRITE32(content
.reserved2
, _value
);
654 class macho_dylib_command
{
656 uint32_t cmd() const;
657 void set_cmd(uint32_t);
659 uint32_t cmdsize() const;
660 void set_cmdsize(uint32_t);
662 const char* name() const;
663 void set_name_offset();
665 uint32_t timestamp() const;
666 void set_timestamp(uint32_t);
668 uint32_t current_version() const;
669 void set_current_version(uint32_t);
671 uint32_t compatibility_version() const;
672 void set_compatibility_version(uint32_t);
674 enum { name_offset
= sizeof(struct dylib_command
) };
677 struct dylib_command content
;
679 #define dylib_command __my_bad
681 inline __attribute__((always_inline
))
682 uint32_t macho_dylib_command::cmd() const {
683 return ENDIAN_READ32(content
.cmd
);
686 inline __attribute__((always_inline
))
687 void macho_dylib_command::set_cmd(uint32_t _value
) {
688 ENDIAN_WRITE32(content
.cmd
, _value
);
691 inline __attribute__((always_inline
))
692 uint32_t macho_dylib_command::cmdsize() const {
693 return ENDIAN_READ32(content
.cmdsize
);
696 inline __attribute__((always_inline
))
697 void macho_dylib_command::set_cmdsize(uint32_t _value
) {
698 ENDIAN_WRITE32(content
.cmdsize
, _value
);
701 inline __attribute__((always_inline
))
702 const char* macho_dylib_command::name() const {
703 return (char*)(&content
) + ENDIAN_READ32(content
.dylib
.name
.offset
);
706 inline __attribute__((always_inline
))
707 void macho_dylib_command::set_name_offset() {
708 ENDIAN_WRITE32(content
.dylib
.name
.offset
, name_offset
);
711 inline __attribute__((always_inline
))
712 uint32_t macho_dylib_command::timestamp() const {
713 return ENDIAN_READ32(content
.dylib
.timestamp
);
716 inline __attribute__((always_inline
))
717 void macho_dylib_command::set_timestamp(uint32_t _value
) {
718 ENDIAN_WRITE32(content
.dylib
.timestamp
, _value
);
721 inline __attribute__((always_inline
))
722 uint32_t macho_dylib_command::current_version() const {
723 return ENDIAN_READ32(content
.dylib
.current_version
);
726 inline __attribute__((always_inline
))
727 void macho_dylib_command::set_current_version(uint32_t _value
) {
728 ENDIAN_WRITE32(content
.dylib
.current_version
, _value
);
731 inline __attribute__((always_inline
))
732 uint32_t macho_dylib_command::compatibility_version() const {
733 return ENDIAN_READ32(content
.dylib
.compatibility_version
);
736 inline __attribute__((always_inline
))
737 void macho_dylib_command::set_compatibility_version(uint32_t _value
) {
738 ENDIAN_WRITE32(content
.dylib
.compatibility_version
, _value
);
743 #undef dylinker_command
744 class macho_dylinker_command
{
746 uint32_t cmd() const;
747 void set_cmd(uint32_t);
749 uint32_t cmdsize() const;
750 void set_cmdsize(uint32_t);
752 void set_name_offset();
754 enum { name_offset
= sizeof(struct dylinker_command
) };
757 struct dylinker_command content
;
759 #define dylinker_command __my_bad
761 inline __attribute__((always_inline
))
762 uint32_t macho_dylinker_command::cmd() const {
763 return ENDIAN_READ32(content
.cmd
);
766 inline __attribute__((always_inline
))
767 void macho_dylinker_command::set_cmd(uint32_t _value
) {
768 ENDIAN_WRITE32(content
.cmd
, _value
);
771 inline __attribute__((always_inline
))
772 uint32_t macho_dylinker_command::cmdsize() const {
773 return ENDIAN_READ32(content
.cmdsize
);
776 inline __attribute__((always_inline
))
777 void macho_dylinker_command::set_cmdsize(uint32_t _value
) {
778 ENDIAN_WRITE32(content
.cmdsize
, _value
);
781 inline __attribute__((always_inline
))
782 void macho_dylinker_command::set_name_offset() {
783 ENDIAN_WRITE32(content
.name
.offset
, name_offset
);
788 #undef sub_framework_command
789 class macho_sub_framework_command
{
791 uint32_t cmd() const;
792 void set_cmd(uint32_t);
794 uint32_t cmdsize() const;
795 void set_cmdsize(uint32_t);
797 const char* name() const;
798 void set_name_offset();
800 enum { name_offset
= sizeof(struct sub_framework_command
) };
803 struct sub_framework_command content
;
805 #define sub_framework_command __my_bad
807 inline __attribute__((always_inline
))
808 uint32_t macho_sub_framework_command::cmd() const {
809 return ENDIAN_READ32(content
.cmd
);
812 inline __attribute__((always_inline
))
813 void macho_sub_framework_command::set_cmd(uint32_t _value
) {
814 ENDIAN_WRITE32(content
.cmd
, _value
);
817 inline __attribute__((always_inline
))
818 uint32_t macho_sub_framework_command::cmdsize() const {
819 return ENDIAN_READ32(content
.cmdsize
);
822 inline __attribute__((always_inline
))
823 void macho_sub_framework_command::set_cmdsize(uint32_t _value
) {
824 ENDIAN_WRITE32(content
.cmdsize
, _value
);
827 inline __attribute__((always_inline
))
828 const char* macho_sub_framework_command::name() const {
829 return (char*)(&content
) + ENDIAN_READ32(content
.umbrella
.offset
);
832 inline __attribute__((always_inline
))
833 void macho_sub_framework_command::set_name_offset() {
834 ENDIAN_WRITE32(content
.umbrella
.offset
, name_offset
);
837 #undef sub_client_command
838 class macho_sub_client_command
{
840 uint32_t cmd() const;
841 void set_cmd(uint32_t);
843 uint32_t cmdsize() const;
844 void set_cmdsize(uint32_t);
846 const char* name() const;
847 void set_name_offset();
849 enum { name_offset
= sizeof(struct sub_client_command
) };
851 struct sub_client_command content
;
853 #define sub_client_command __my_bad
855 inline __attribute__((always_inline
))
856 uint32_t macho_sub_client_command::cmd() const {
857 return ENDIAN_READ32(content
.cmd
);
860 inline __attribute__((always_inline
))
861 void macho_sub_client_command::set_cmd(uint32_t _value
) {
862 ENDIAN_WRITE32(content
.cmd
, _value
);
865 inline __attribute__((always_inline
))
866 uint32_t macho_sub_client_command::cmdsize() const {
867 return ENDIAN_READ32(content
.cmdsize
);
870 inline __attribute__((always_inline
))
871 void macho_sub_client_command::set_cmdsize(uint32_t _value
) {
872 ENDIAN_WRITE32(content
.cmdsize
, _value
);
875 inline __attribute__((always_inline
))
876 const char* macho_sub_client_command::name() const {
877 return (char*)(&content
) + ENDIAN_READ32(content
.client
.offset
);
880 inline __attribute__((always_inline
))
881 void macho_sub_client_command::set_name_offset() {
882 ENDIAN_WRITE32(content
.client
.offset
, name_offset
);
887 #undef sub_umbrella_command
888 class macho_sub_umbrella_command
{
890 uint32_t cmd() const;
891 void set_cmd(uint32_t);
893 uint32_t cmdsize() const;
894 void set_cmdsize(uint32_t);
896 const char* name() const;
897 void set_name_offset();
899 enum { name_offset
= sizeof(struct sub_umbrella_command
) };
901 struct sub_umbrella_command content
;
903 #define sub_umbrella_command __my_bad
905 inline __attribute__((always_inline
))
906 uint32_t macho_sub_umbrella_command::cmd() const {
907 return ENDIAN_READ32(content
.cmd
);
910 inline __attribute__((always_inline
))
911 void macho_sub_umbrella_command::set_cmd(uint32_t _value
) {
912 ENDIAN_WRITE32(content
.cmd
, _value
);
915 inline __attribute__((always_inline
))
916 uint32_t macho_sub_umbrella_command::cmdsize() const {
917 return ENDIAN_READ32(content
.cmdsize
);
920 inline __attribute__((always_inline
))
921 void macho_sub_umbrella_command::set_cmdsize(uint32_t _value
) {
922 ENDIAN_WRITE32(content
.cmdsize
, _value
);
925 inline __attribute__((always_inline
))
926 const char* macho_sub_umbrella_command::name() const {
927 return (char*)(&content
) + ENDIAN_READ32(content
.sub_umbrella
.offset
);
930 inline __attribute__((always_inline
))
931 void macho_sub_umbrella_command::set_name_offset() {
932 ENDIAN_WRITE32(content
.sub_umbrella
.offset
, name_offset
);
938 #undef sub_library_command
939 class macho_sub_library_command
{
941 uint32_t cmd() const;
942 void set_cmd(uint32_t);
944 uint32_t cmdsize() const;
945 void set_cmdsize(uint32_t);
947 const char* name() const;
948 void set_name_offset();
950 enum { name_offset
= sizeof(struct sub_library_command
) };
952 struct sub_library_command content
;
954 #define sub_library_command __my_bad
956 inline __attribute__((always_inline
))
957 uint32_t macho_sub_library_command::cmd() const {
958 return ENDIAN_READ32(content
.cmd
);
961 inline __attribute__((always_inline
))
962 void macho_sub_library_command::set_cmd(uint32_t _value
) {
963 ENDIAN_WRITE32(content
.cmd
, _value
);
966 inline __attribute__((always_inline
))
967 uint32_t macho_sub_library_command::cmdsize() const {
968 return ENDIAN_READ32(content
.cmdsize
);
971 inline __attribute__((always_inline
))
972 void macho_sub_library_command::set_cmdsize(uint32_t _value
) {
973 ENDIAN_WRITE32(content
.cmdsize
, _value
);
976 inline __attribute__((always_inline
))
977 const char* macho_sub_library_command::name() const {
978 return (char*)(&content
) + ENDIAN_READ32(content
.sub_library
.offset
);
981 inline __attribute__((always_inline
))
982 void macho_sub_library_command::set_name_offset() {
983 ENDIAN_WRITE32(content
.sub_library
.offset
, name_offset
);
988 #undef routines_command
989 #undef routines_command_64
990 class macho_routines_command
{
992 uint32_t cmd() const;
993 void set_cmd(uint32_t);
995 uint32_t cmdsize() const;
996 void set_cmdsize(uint32_t);
998 uint64_t init_address() const;
999 void set_init_address(uint64_t);
1001 uint64_t init_module() const;
1002 void set_init_module(uint64_t);
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
};
1008 enum { size
= sizeof(struct routines_command
) };
1009 enum { command
= LC_ROUTINES
};
1013 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
1014 struct routines_command_64 content
;
1016 struct routines_command content
;
1019 #define routines_command __my_bad
1020 #define routines_command_64 __my_bad
1022 inline __attribute__((always_inline
))
1023 uint32_t macho_routines_command::cmd() const {
1024 return ENDIAN_READ32(content
.cmd
);
1027 inline __attribute__((always_inline
))
1028 void macho_routines_command::set_cmd(uint32_t _value
) {
1029 ENDIAN_WRITE32(content
.cmd
, _value
);
1032 inline __attribute__((always_inline
))
1033 uint32_t macho_routines_command::cmdsize() const {
1034 return ENDIAN_READ32(content
.cmdsize
);
1037 inline __attribute__((always_inline
))
1038 void macho_routines_command::set_cmdsize(uint32_t _value
) {
1039 ENDIAN_WRITE32(content
.cmdsize
, _value
);
1042 inline __attribute__((always_inline
))
1043 uint64_t macho_routines_command::init_address() const {
1044 return ENDIAN_SWAP64(content
.init_address
);
1047 inline __attribute__((always_inline
))
1048 void macho_routines_command::set_init_address(uint64_t _value
) {
1049 content
.init_address
= ENDIAN_SWAP64(_value
);
1052 inline __attribute__((always_inline
))
1053 uint64_t macho_routines_command::init_module() const {
1054 return ENDIAN_SWAP64(content
.init_module
);
1057 inline __attribute__((always_inline
))
1058 void macho_routines_command::set_init_module(uint64_t _value
) {
1059 content
.init_module
= ENDIAN_SWAP64(_value
);
1064 #undef symtab_command
1065 class macho_symtab_command
{
1067 uint32_t cmd() const;
1068 void set_cmd(uint32_t);
1070 uint32_t cmdsize() const;
1071 void set_cmdsize(uint32_t);
1073 uint32_t symoff() const;
1074 void set_symoff(uint32_t);
1076 uint32_t nsyms() const;
1077 void set_nsyms(uint32_t);
1079 uint32_t stroff() const;
1080 void set_stroff(uint32_t);
1082 uint32_t strsize() const;
1083 void set_strsize(uint32_t);
1085 enum { size
= sizeof(struct symtab_command
) };
1088 struct symtab_command content
;
1090 #define symtab_command __my_bad
1093 inline __attribute__((always_inline
))
1094 uint32_t macho_symtab_command::cmd() const {
1095 return ENDIAN_READ32(content
.cmd
);
1098 inline __attribute__((always_inline
))
1099 void macho_symtab_command::set_cmd(uint32_t _value
) {
1100 ENDIAN_WRITE32(content
.cmd
, _value
);
1103 inline __attribute__((always_inline
))
1104 uint32_t macho_symtab_command::cmdsize() const {
1105 return ENDIAN_READ32(content
.cmdsize
);
1108 inline __attribute__((always_inline
))
1109 void macho_symtab_command::set_cmdsize(uint32_t _value
) {
1110 ENDIAN_WRITE32(content
.cmdsize
, _value
);
1113 inline __attribute__((always_inline
))
1114 uint32_t macho_symtab_command::symoff() const {
1115 return ENDIAN_READ32(content
.symoff
);
1118 inline __attribute__((always_inline
))
1119 void macho_symtab_command::set_symoff(uint32_t _value
) {
1120 ENDIAN_WRITE32(content
.symoff
, _value
);
1123 inline __attribute__((always_inline
))
1124 uint32_t macho_symtab_command::nsyms() const {
1125 return ENDIAN_READ32(content
.nsyms
);
1128 inline __attribute__((always_inline
))
1129 void macho_symtab_command::set_nsyms(uint32_t _value
) {
1130 ENDIAN_WRITE32(content
.nsyms
, _value
);
1133 inline __attribute__((always_inline
))
1134 uint32_t macho_symtab_command::stroff() const {
1135 return ENDIAN_READ32(content
.stroff
);
1138 inline __attribute__((always_inline
))
1139 void macho_symtab_command::set_stroff(uint32_t _value
) {
1140 ENDIAN_WRITE32(content
.stroff
, _value
);
1143 inline __attribute__((always_inline
))
1144 uint32_t macho_symtab_command::strsize() const {
1145 return ENDIAN_READ32(content
.strsize
);
1148 inline __attribute__((always_inline
))
1149 void macho_symtab_command::set_strsize(uint32_t _value
) {
1150 ENDIAN_WRITE32(content
.strsize
, _value
);
1154 #undef dysymtab_command
1155 class macho_dysymtab_command
{
1157 uint32_t cmd() const;
1158 void set_cmd(uint32_t);
1160 uint32_t cmdsize() const;
1161 void set_cmdsize(uint32_t);
1163 uint32_t ilocalsym() const;
1164 void set_ilocalsym(uint32_t);
1166 uint32_t nlocalsym() const;
1167 void set_nlocalsym(uint32_t);
1169 uint32_t iextdefsym() const;
1170 void set_iextdefsym(uint32_t);
1172 uint32_t nextdefsym() const;
1173 void set_nextdefsym(uint32_t);
1175 uint32_t iundefsym() const;
1176 void set_iundefsym(uint32_t);
1178 uint32_t nundefsym() const;
1179 void set_nundefsym(uint32_t);
1181 uint32_t tocoff() const;
1182 void set_tocoff(uint32_t);
1184 uint32_t ntoc() const;
1185 void set_ntoc(uint32_t);
1187 uint32_t modtaboff() const;
1188 void set_modtaboff(uint32_t);
1190 uint32_t nmodtab() const;
1191 void set_nmodtab(uint32_t);
1193 uint32_t extrefsymoff() const;
1194 void set_extrefsymoff(uint32_t);
1196 uint32_t nextrefsyms() const;
1197 void set_nextrefsyms(uint32_t);
1199 uint32_t indirectsymoff() const;
1200 void set_indirectsymoff(uint32_t);
1202 uint32_t nindirectsyms() const;
1203 void set_nindirectsyms(uint32_t);
1205 uint32_t extreloff() const;
1206 void set_extreloff(uint32_t);
1208 uint32_t nextrel() const;
1209 void set_nextrel(uint32_t);
1211 uint32_t locreloff() const;
1212 void set_locreloff(uint32_t);
1214 uint32_t nlocrel() const;
1215 void set_nlocrel(uint32_t);
1217 enum { size
= sizeof(struct dysymtab_command
) };
1219 struct dysymtab_command content
;
1221 #define dysymtab_command __my_bad
1223 inline __attribute__((always_inline
))
1224 uint32_t macho_dysymtab_command::cmd() const {
1225 return ENDIAN_READ32(content
.cmd
);
1228 inline __attribute__((always_inline
))
1229 void macho_dysymtab_command::set_cmd(uint32_t _value
) {
1230 ENDIAN_WRITE32(content
.cmd
, _value
);
1233 inline __attribute__((always_inline
))
1234 uint32_t macho_dysymtab_command::cmdsize() const {
1235 return ENDIAN_READ32(content
.cmdsize
);
1238 inline __attribute__((always_inline
))
1239 void macho_dysymtab_command::set_cmdsize(uint32_t _value
) {
1240 ENDIAN_WRITE32(content
.cmdsize
, _value
);
1243 inline __attribute__((always_inline
))
1244 uint32_t macho_dysymtab_command::ilocalsym() const {
1245 return ENDIAN_READ32(content
.ilocalsym
);
1248 inline __attribute__((always_inline
))
1249 void macho_dysymtab_command::set_ilocalsym(uint32_t _value
) {
1250 ENDIAN_WRITE32(content
.ilocalsym
, _value
);
1253 inline __attribute__((always_inline
))
1254 uint32_t macho_dysymtab_command::nlocalsym() const {
1255 return ENDIAN_READ32(content
.nlocalsym
);
1258 inline __attribute__((always_inline
))
1259 void macho_dysymtab_command::set_nlocalsym(uint32_t _value
) {
1260 ENDIAN_WRITE32(content
.nlocalsym
, _value
);
1263 inline __attribute__((always_inline
))
1264 uint32_t macho_dysymtab_command::iextdefsym() const {
1265 return ENDIAN_READ32(content
.iextdefsym
);
1268 inline __attribute__((always_inline
))
1269 void macho_dysymtab_command::set_iextdefsym(uint32_t _value
) {
1270 ENDIAN_WRITE32(content
.iextdefsym
, _value
);
1273 inline __attribute__((always_inline
))
1274 uint32_t macho_dysymtab_command::nextdefsym() const {
1275 return ENDIAN_READ32(content
.nextdefsym
);
1278 inline __attribute__((always_inline
))
1279 void macho_dysymtab_command::set_nextdefsym(uint32_t _value
) {
1280 ENDIAN_WRITE32(content
.nextdefsym
, _value
);
1283 inline __attribute__((always_inline
))
1284 uint32_t macho_dysymtab_command::iundefsym() const {
1285 return ENDIAN_READ32(content
.iundefsym
);
1288 inline __attribute__((always_inline
))
1289 void macho_dysymtab_command::set_iundefsym(uint32_t _value
) {
1290 ENDIAN_WRITE32(content
.iundefsym
, _value
);
1293 inline __attribute__((always_inline
))
1294 uint32_t macho_dysymtab_command::nundefsym() const {
1295 return ENDIAN_READ32(content
.nundefsym
);
1298 inline __attribute__((always_inline
))
1299 void macho_dysymtab_command::set_nundefsym(uint32_t _value
) {
1300 ENDIAN_WRITE32(content
.nundefsym
, _value
);
1303 inline __attribute__((always_inline
))
1304 uint32_t macho_dysymtab_command::tocoff() const {
1305 return ENDIAN_READ32(content
.tocoff
);
1308 inline __attribute__((always_inline
))
1309 void macho_dysymtab_command::set_tocoff(uint32_t _value
) {
1310 ENDIAN_WRITE32(content
.tocoff
, _value
);
1313 inline __attribute__((always_inline
))
1314 uint32_t macho_dysymtab_command::ntoc() const {
1315 return ENDIAN_READ32(content
.ntoc
);
1318 inline __attribute__((always_inline
))
1319 void macho_dysymtab_command::set_ntoc(uint32_t _value
) {
1320 ENDIAN_WRITE32(content
.ntoc
, _value
);
1323 inline __attribute__((always_inline
))
1324 uint32_t macho_dysymtab_command::modtaboff() const {
1325 return ENDIAN_READ32(content
.modtaboff
);
1328 inline __attribute__((always_inline
))
1329 void macho_dysymtab_command::set_modtaboff(uint32_t _value
) {
1330 ENDIAN_WRITE32(content
.modtaboff
, _value
);
1333 inline __attribute__((always_inline
))
1334 uint32_t macho_dysymtab_command::nmodtab() const {
1335 return ENDIAN_READ32(content
.nmodtab
);
1338 inline __attribute__((always_inline
))
1339 void macho_dysymtab_command::set_nmodtab(uint32_t _value
) {
1340 ENDIAN_WRITE32(content
.nmodtab
, _value
);
1343 inline __attribute__((always_inline
))
1344 uint32_t macho_dysymtab_command::extrefsymoff() const {
1345 return ENDIAN_READ32(content
.extrefsymoff
);
1348 inline __attribute__((always_inline
))
1349 void macho_dysymtab_command::set_extrefsymoff(uint32_t _value
) {
1350 ENDIAN_WRITE32(content
.extrefsymoff
, _value
);
1353 inline __attribute__((always_inline
))
1354 uint32_t macho_dysymtab_command::nextrefsyms() const {
1355 return ENDIAN_READ32(content
.nextrefsyms
);
1358 inline __attribute__((always_inline
))
1359 void macho_dysymtab_command::set_nextrefsyms(uint32_t _value
) {
1360 ENDIAN_WRITE32(content
.nextrefsyms
, _value
);
1363 inline __attribute__((always_inline
))
1364 uint32_t macho_dysymtab_command::indirectsymoff() const {
1365 return ENDIAN_READ32(content
.indirectsymoff
);
1368 inline __attribute__((always_inline
))
1369 void macho_dysymtab_command::set_indirectsymoff(uint32_t _value
) {
1370 ENDIAN_WRITE32(content
.indirectsymoff
, _value
);
1373 inline __attribute__((always_inline
))
1374 uint32_t macho_dysymtab_command::nindirectsyms() const {
1375 return ENDIAN_READ32(content
.nindirectsyms
);
1378 inline __attribute__((always_inline
))
1379 void macho_dysymtab_command::set_nindirectsyms(uint32_t _value
) {
1380 ENDIAN_WRITE32(content
.nindirectsyms
, _value
);
1383 inline __attribute__((always_inline
))
1384 uint32_t macho_dysymtab_command::extreloff() const {
1385 return ENDIAN_READ32(content
.extreloff
);
1388 inline __attribute__((always_inline
))
1389 void macho_dysymtab_command::set_extreloff(uint32_t _value
) {
1390 ENDIAN_WRITE32(content
.extreloff
, _value
);
1393 inline __attribute__((always_inline
))
1394 uint32_t macho_dysymtab_command::nextrel() const {
1395 return ENDIAN_READ32(content
.nextrel
);
1398 inline __attribute__((always_inline
))
1399 void macho_dysymtab_command::set_nextrel(uint32_t _value
) {
1400 ENDIAN_WRITE32(content
.nextrel
, _value
);
1403 inline __attribute__((always_inline
))
1404 uint32_t macho_dysymtab_command::locreloff() const {
1405 return ENDIAN_READ32(content
.locreloff
);
1408 inline __attribute__((always_inline
))
1409 void macho_dysymtab_command::set_locreloff(uint32_t _value
) {
1410 ENDIAN_WRITE32(content
.locreloff
, _value
);
1413 inline __attribute__((always_inline
))
1414 uint32_t macho_dysymtab_command::nlocrel() const {
1415 return ENDIAN_READ32(content
.nlocrel
);
1418 inline __attribute__((always_inline
))
1419 void macho_dysymtab_command::set_nlocrel(uint32_t _value
) {
1420 ENDIAN_WRITE32(content
.nlocrel
, _value
);
1425 #undef twolevel_hints_command
1426 class macho_twolevel_hints_command
{
1428 uint32_t cmd() const;
1429 void set_cmd(uint32_t);
1431 uint32_t cmdsize() const;
1432 void set_cmdsize(uint32_t);
1434 uint32_t offset() const;
1435 void set_offset(uint32_t);
1437 uint32_t nhints() const;
1438 void set_nhints(uint32_t);
1441 struct twolevel_hints_command content
;
1443 #define twolevel_hints_command __my_bad
1445 inline __attribute__((always_inline
))
1446 uint32_t macho_twolevel_hints_command::cmd() const {
1447 return ENDIAN_READ32(content
.cmd
);
1450 inline __attribute__((always_inline
))
1451 void macho_twolevel_hints_command::set_cmd(uint32_t _value
) {
1452 ENDIAN_WRITE32(content
.cmd
, _value
);
1455 inline __attribute__((always_inline
))
1456 uint32_t macho_twolevel_hints_command::cmdsize() const {
1457 return ENDIAN_READ32(content
.cmdsize
);
1460 inline __attribute__((always_inline
))
1461 void macho_twolevel_hints_command::set_cmdsize(uint32_t _value
) {
1462 ENDIAN_WRITE32(content
.cmdsize
, _value
);
1465 inline __attribute__((always_inline
))
1466 uint32_t macho_twolevel_hints_command::offset() const {
1467 return ENDIAN_READ32(content
.offset
);
1470 inline __attribute__((always_inline
))
1471 void macho_twolevel_hints_command::set_offset(uint32_t _value
) {
1472 ENDIAN_WRITE32(content
.offset
, _value
);
1475 inline __attribute__((always_inline
))
1476 uint32_t macho_twolevel_hints_command::nhints() const {
1477 return ENDIAN_READ32(content
.nhints
);
1480 inline __attribute__((always_inline
))
1481 void macho_twolevel_hints_command::set_nhints(uint32_t _value
) {
1482 ENDIAN_WRITE32(content
.nhints
, _value
);
1486 #undef thread_command
1487 class macho_thread_command
{
1489 uint32_t cmd() const;
1490 void set_cmd(uint32_t);
1492 uint32_t cmdsize() const;
1493 void set_cmdsize(uint32_t);
1495 uint32_t flavor() const;
1496 void set_flavor(uint32_t);
1498 uint32_t count() const;
1499 void set_count(uint32_t);
1501 uint32_t threadState32(uint32_t index
) const;
1502 void set_threadState32(uint32_t index
, uint32_t value
);
1504 uint64_t threadState64(uint32_t offset
) const;
1505 void set_threadState64(uint32_t index
, uint64_t value
);
1507 enum { size
= sizeof(struct thread_command
) + 8 };
1510 struct thread_command content
;
1511 uint32_t content_flavor
;
1512 uint32_t content_count
;
1513 uint32_t threadState
[1];
1515 #define thread_command __my_bad
1517 inline __attribute__((always_inline
))
1518 uint32_t macho_thread_command::cmd() const {
1519 return ENDIAN_READ32(content
.cmd
);
1522 inline __attribute__((always_inline
))
1523 void macho_thread_command::set_cmd(uint32_t _value
) {
1524 ENDIAN_WRITE32(content
.cmd
, _value
);
1527 inline __attribute__((always_inline
))
1528 uint32_t macho_thread_command::cmdsize() const {
1529 return ENDIAN_READ32(content
.cmdsize
);
1532 inline __attribute__((always_inline
))
1533 void macho_thread_command::set_cmdsize(uint32_t _value
) {
1534 ENDIAN_WRITE32(content
.cmdsize
, _value
);
1537 inline __attribute__((always_inline
))
1538 uint32_t macho_thread_command::flavor() const {
1539 return ENDIAN_READ32(content_flavor
);
1542 inline __attribute__((always_inline
))
1543 void macho_thread_command::set_flavor(uint32_t _value
) {
1544 ENDIAN_WRITE32(content_flavor
, _value
);
1547 inline __attribute__((always_inline
))
1548 uint32_t macho_thread_command::count() const {
1549 return ENDIAN_READ32(content_count
);
1552 inline __attribute__((always_inline
))
1553 void macho_thread_command::set_count(uint32_t _value
) {
1554 ENDIAN_WRITE32(content_count
, _value
);
1557 inline __attribute__((always_inline
))
1558 uint32_t macho_thread_command::threadState32(uint32_t index
) const
1560 return ENDIAN_READ32(threadState
[index
]);
1563 inline __attribute__((always_inline
))
1564 void macho_thread_command::set_threadState32(uint32_t index
, uint32_t _value
)
1566 ENDIAN_WRITE32(threadState
[index
], _value
);
1569 inline __attribute__((always_inline
))
1570 uint64_t macho_thread_command::threadState64(uint32_t index
) const
1572 uint64_t temp
= *((uint64_t*)(&threadState
[index
]));
1573 return ENDIAN_SWAP64(temp
);
1576 inline __attribute__((always_inline
))
1577 void macho_thread_command::set_threadState64(uint32_t index
, uint64_t _value
)
1579 *((uint64_t*)(&threadState
[index
])) = ENDIAN_SWAP64(_value
);
1588 uint32_t n_strx() const;
1589 void set_n_strx(uint32_t);
1591 uint8_t n_type() const;
1592 void set_n_type(uint8_t);
1594 uint8_t n_sect() const;
1595 void set_n_sect(uint8_t);
1597 uint16_t n_desc() const;
1598 void set_n_desc(uint16_t);
1600 uint64_t n_value() const;
1601 void set_n_value(uint64_t);
1604 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
1605 enum { size
= sizeof(struct nlist_64
) };
1607 enum { size
= sizeof(struct nlist
) };
1611 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
1612 struct nlist_64 content
;
1614 struct nlist content
;
1617 #define nlist __my_bad
1618 #define nlist_64 __my_bad
1620 inline __attribute__((always_inline
))
1621 uint32_t macho_nlist::n_strx() const {
1622 return ENDIAN_READ32(content
.n_un
.n_strx
);
1625 inline __attribute__((always_inline
))
1626 void macho_nlist::set_n_strx(uint32_t _value
) {
1627 ENDIAN_WRITE32(content
.n_un
.n_strx
, _value
);
1630 inline __attribute__((always_inline
))
1631 uint8_t macho_nlist::n_type() const {
1632 return content
.n_type
;
1635 inline __attribute__((always_inline
))
1636 void macho_nlist::set_n_type(uint8_t _value
) {
1637 content
.n_type
= _value
;
1640 inline __attribute__((always_inline
))
1641 uint8_t macho_nlist::n_sect() const {
1642 return content
.n_sect
;
1645 inline __attribute__((always_inline
))
1646 void macho_nlist::set_n_sect(uint8_t _value
) {
1647 content
.n_sect
= _value
;
1650 inline __attribute__((always_inline
))
1651 uint16_t macho_nlist::n_desc() const {
1652 return ENDIAN_READ16(content
.n_desc
);
1655 inline __attribute__((always_inline
))
1656 void macho_nlist::set_n_desc(uint16_t _value
) {
1657 ENDIAN_WRITE16(content
.n_desc
, _value
);
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
);
1667 #error unknown architecture
1671 inline __attribute__((always_inline
))
1672 void macho_nlist::set_n_value(uint64_t _value
) {
1673 content
.n_value
= ENDIAN_SWAP64(_value
);
1678 #undef relocation_info
1679 class macho_relocation_info
{
1681 int32_t r_address() const;
1682 void set_r_address(int32_t);
1684 uint32_t r_symbolnum() const;
1685 void set_r_symbolnum(uint32_t);
1687 bool r_pcrel() const;
1688 void set_r_pcrel(bool);
1690 uint8_t r_length() const;
1691 void set_r_length(uint8_t);
1693 bool r_extern() const;
1694 void set_r_extern(bool);
1696 uint8_t r_type() const;
1697 void set_r_type(uint8_t);
1699 enum { size
= sizeof(struct relocation_info
) };
1700 #if defined(MACHO_64_SAME_ENDIAN) || defined(MACHO_64_OPPOSITE_ENDIAN)
1701 enum { pointer_length
= 3 };
1703 enum { pointer_length
= 2 };
1707 struct relocation_info content
;
1709 #define relocation_info __my_bad
1712 inline __attribute__((always_inline
))
1713 int32_t macho_relocation_info::r_address() const {
1714 return ENDIAN_READ32(content
.r_address
);
1717 inline __attribute__((always_inline
))
1718 void macho_relocation_info::set_r_address(int32_t _value
) {
1719 ENDIAN_WRITE32(content
.r_address
, _value
);
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)
1727 #elif defined(ARCH_I386)
1728 return temp
& 0x00FFFFFF;
1730 #error unknown architecture
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)
1739 temp
|= ((_value
& 0x00FFFFFF) << 8);
1740 #elif defined(ARCH_I386)
1742 temp
|= (_value
& 0x00FFFFFF);
1744 #error unknown architecture
1746 ENDIAN_WRITE32(((uint32_t*)&content
)[1], temp
);
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);
1757 #error unknown architecture
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)
1768 #elif defined(ARCH_I386)
1773 #error unknown architecture
1775 ENDIAN_WRITE32(((uint32_t*)&content
)[1], temp
);
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);
1786 #error unknown architecture
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)
1795 temp
|= ((_value
& 0x03) << 5);
1796 #elif defined(ARCH_I386)
1798 temp
|= ((_value
& 0x03) << 25);
1800 #error unknown architecture
1802 ENDIAN_WRITE32(((uint32_t*)&content
)[1], temp
);
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);
1813 #error unknown architecture
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)
1824 #elif defined(ARCH_I386)
1829 #error unknown architecture
1831 ENDIAN_WRITE32(((uint32_t*)&content
)[1], temp
);
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);
1842 #error unknown architecture
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)
1851 temp
|= (_value
& 0x0F);
1852 #elif defined(ARCH_I386)
1854 temp
|= ((_value
& 0x0F) << 28);
1856 #error unknown architecture
1858 ENDIAN_WRITE32(((uint32_t*)&content
)[1], temp
);
1863 #undef scattered_relocation_info
1864 class macho_scattered_relocation_info
{
1866 bool r_scattered() const;
1867 void set_r_scattered(bool);
1869 bool r_pcrel() const;
1870 void set_r_pcrel(bool);
1872 uint8_t r_length() const;
1873 void set_r_length(uint8_t);
1875 uint8_t r_type() const;
1876 void set_r_type(uint8_t);
1878 uint32_t r_address() const;
1879 void set_r_address(uint32_t);
1881 int32_t r_value() const;
1882 void set_r_value(int32_t);
1885 struct scattered_relocation_info content
;
1887 #define scattered_relocation_info __my_bad
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);
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
));
1902 temp
&= ~0x80000000;
1903 ENDIAN_WRITE32(*((uint32_t*)&content
), temp
);
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);
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
));
1919 temp
&= ~0x40000000;
1920 ENDIAN_WRITE32(*((uint32_t*)&content
), temp
);
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;
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
));
1933 temp
|= ((_value
& 0x03) << 28);
1934 ENDIAN_WRITE32(*((uint32_t*)&content
), temp
);
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;
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
));
1947 temp
|= ((_value
&0x0F) << 24);
1948 ENDIAN_WRITE32(*((uint32_t*)&content
), temp
);
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;
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;
1963 ENDIAN_WRITE32(*((uint32_t*)&content
), temp
);
1966 inline __attribute__((always_inline
))
1967 int32_t macho_scattered_relocation_info::r_value() const {
1968 return ENDIAN_READ32(content
.r_value
);
1971 inline __attribute__((always_inline
))
1972 void macho_scattered_relocation_info::set_r_value(int32_t _value
) {
1973 ENDIAN_WRITE32(content
.r_value
, _value
);