2 * Copyright (c) 2009-2014 Apple Inc. All rights reserved.
4 * @APPLE_OSREFERENCE_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. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
29 #include <sys/types.h>
32 #include <libkern/kernel_mach_header.h>
33 #include <mach/machine.h>
34 #include <mach/vm_param.h>
35 #include <mach-o/fat.h>
37 /* Get machine.h from the kernel source so we can support all platforms
38 * that the kernel supports. Otherwise we're at the mercy of the host.
40 #include "../../osfmk/mach/machine.h"
42 #include <architecture/byte_order.h>
43 #include <mach/mach_init.h>
44 #include <mach-o/arch.h>
45 #include <mach-o/swap.h>
48 #include <mach-o/loader.h>
49 #include <mach-o/nlist.h>
50 #include <mach-o/reloc.h>
52 #define DEBUG_ASSERT_COMPONENT_NAME_STRING "kxld"
53 #include <AssertMacros.h>
55 #include "kxld_demangle.h"
56 #include "kxld_dict.h"
57 #include "kxld_reloc.h"
58 #include "kxld_sect.h"
60 #include "kxld_srcversion.h"
61 #include "kxld_symtab.h"
62 #include "kxld_util.h"
63 #include "kxld_uuid.h"
64 #include "kxld_versionmin.h"
65 #include "kxld_vtable.h"
66 #include "kxld_splitinfolc.h"
68 #include "kxld_object.h"
70 extern boolean_t isSplitKext
;
71 extern boolean_t isOldInterface
;
73 /*******************************************************************************
75 *******************************************************************************/
78 u_char
*file
; // used by old interface
79 u_long size
; // used by old interface
83 cpu_subtype_t cpusubtype
;
88 KXLDRelocator relocator
;
90 KXLDversionmin versionmin
;
91 KXLDsrcversion srcversion
;
93 struct dysymtab_command
*dysymtab_hdr
;
94 KXLDsplitinfolc splitinfolc
;
95 splitKextLinkInfo split_info
;
96 kxld_addr_t link_addr
;
97 u_long output_buffer_size
;
99 boolean_t is_final_image
;
101 boolean_t got_is_created
;
102 #if KXLD_USER_OR_OBJECT
103 KXLDArray
*section_order
;
106 boolean_t include_kaslr_relocs
;
109 enum NXByteOrder host_order
;
110 enum NXByteOrder target_order
;
114 /*******************************************************************************
116 *******************************************************************************/
118 static kern_return_t
get_target_machine_info(KXLDObject
*object
,
119 cpu_type_t cputype
, cpu_subtype_t cpusubtype
);
120 static kern_return_t
get_macho_slice_for_arch(KXLDObject
*object
,
121 u_char
*file
, u_long size
);
123 static u_long
get_macho_header_size(const KXLDObject
*object
);
124 static u_long
get_macho_data_size(const KXLDObject
*object
) __unused
;
126 static kern_return_t
init_from_execute(KXLDObject
*object
);
127 static kern_return_t
init_from_final_linked_image(KXLDObject
*object
,
128 u_int
*filetype_out
, struct symtab_command
**symtab_hdr_out
);
130 static boolean_t
target_supports_protected_segments(const KXLDObject
*object
)
131 __attribute__((pure
));
132 static void set_is_object_linked(KXLDObject
*object
);
134 #if KXLD_USER_OR_BUNDLE
135 static boolean_t
target_supports_bundle(const KXLDObject
*object
)
137 static kern_return_t
init_from_bundle(KXLDObject
*object
);
138 static kern_return_t
process_relocs_from_tables(KXLDObject
*object
);
139 static KXLDSeg
*get_seg_by_base_addr(KXLDObject
*object
,
140 kxld_addr_t base_addr
);
141 static kern_return_t
process_symbol_pointers(KXLDObject
*object
);
142 static void add_to_ptr(u_char
*symptr
, kxld_addr_t val
, boolean_t is_32_bit
);
143 #endif /* KXLD_USER_OR_BUNDLE */
145 #if KXLD_USER_OR_OBJECT
146 static boolean_t
target_supports_object(const KXLDObject
*object
)
148 static kern_return_t
init_from_object(KXLDObject
*object
);
149 static kern_return_t
process_relocs_from_sections(KXLDObject
*object
);
150 #endif /* KXLD_USER_OR_OBJECT */
153 static boolean_t
target_supports_slideable_kexts(const KXLDObject
*object
);
154 #endif /* KXLD_PIC_KEXTS */
157 static kern_return_t
export_macho_header(const KXLDObject
*object
, u_char
*buf
,
158 u_int ncmds
, u_long
*header_offset
, u_long header_size
);
159 #if KXLD_USER_OR_ILP32
160 static u_long
get_macho_cmd_data_32(u_char
*file
, u_long offset
,
161 u_int
*filetype
, u_int
*ncmds
);
162 static kern_return_t
export_macho_header_32(const KXLDObject
*object
,
163 u_char
*buf
, u_int ncmds
, u_long
*header_offset
, u_long header_size
);
164 #endif /* KXLD_USER_OR_ILP32 */
165 #if KXLD_USER_OR_LP64
166 static u_long
get_macho_cmd_data_64(u_char
*file
, u_long offset
,
167 u_int
*filetype
, u_int
*ncmds
);
168 static kern_return_t
export_macho_header_64(const KXLDObject
*object
,
169 u_char
*buf
, u_int ncmds
, u_long
*header_offset
, u_long header_size
);
170 #endif /* KXLD_USER_OR_LP64 */
172 #if KXLD_USER_OR_GOT || KXLD_USER_OR_COMMON
173 static kern_return_t
add_section(KXLDObject
*object
, KXLDSect
**sect
);
174 #endif /* KXLD_USER_OR_GOT || KXLD_USER_OR_COMMON */
176 #if KXLD_USER_OR_COMMON
177 static kern_return_t
resolve_common_symbols(KXLDObject
*object
);
178 #endif /* KXLD_USER_OR_COMMON */
181 static boolean_t
target_has_got(const KXLDObject
*object
) __attribute__((pure
));
182 static kern_return_t
create_got(KXLDObject
*object
);
183 static kern_return_t
populate_got(KXLDObject
*object
);
184 #endif /* KXLD_USER_OR_GOT */
186 static KXLDSym
*get_mutable_sym(const KXLDObject
*object
, const KXLDSym
*sym
);
188 static kern_return_t
populate_kmod_info(KXLDObject
*object
);
190 /*******************************************************************************
191 * Prototypes that may need to be exported
192 *******************************************************************************/
193 static boolean_t
kxld_object_target_needs_swap(const KXLDObject
*object __unused
);
194 static KXLDSeg
* kxld_object_get_seg_by_name(const KXLDObject
*object
, const char *segname
);
195 static KXLDSect
* kxld_object_get_sect_by_name(const KXLDObject
*object
, const char *segname
,
196 const char *sectname
);
198 /*******************************************************************************
199 *******************************************************************************/
201 kxld_object_sizeof(void)
203 return sizeof(KXLDObject
);
206 /*******************************************************************************
207 *******************************************************************************/
209 kxld_object_init_from_macho(KXLDObject
*object
, u_char
*file
, u_long size
,
210 const char *name
, KXLDArray
*section_order __unused
,
211 cpu_type_t cputype
, cpu_subtype_t cpusubtype
, KXLDFlags flags __unused
)
213 kern_return_t rval
= KERN_FAILURE
;
214 KXLDSeg
* seg
= NULL
;
224 #if KXLD_USER_OR_OBJECT
225 object
->section_order
= section_order
;
228 object
->include_kaslr_relocs
= ((flags
& kKXLDFlagIncludeRelocs
) == kKXLDFlagIncludeRelocs
);
231 /* Find the local architecture */
233 rval
= get_target_machine_info(object
, cputype
, cpusubtype
);
234 require_noerr(rval
, finish
);
236 /* Find the Mach-O slice for the target architecture */
238 rval
= get_macho_slice_for_arch(object
, file
, size
);
239 require_noerr(rval
, finish
);
241 if (isOldInterface
) {
242 my_file
= object
->file
;
245 my_file
= object
->split_info
.kextExecutable
;
248 /* Allocate the symbol table */
250 if (!object
->symtab
) {
251 object
->symtab
= kxld_alloc(kxld_symtab_sizeof());
252 require_action(object
->symtab
, finish
, rval
=KERN_RESOURCE_SHORTAGE
);
253 bzero(object
->symtab
, kxld_symtab_sizeof());
256 /* Build the relocator */
258 rval
= kxld_relocator_init(&object
->relocator
,
260 object
->symtab
, &object
->sects
,
263 kxld_object_target_needs_swap(object
));
264 require_noerr(rval
, finish
);
266 /* There are four types of Mach-O files that we can support:
267 * 1) 32-bit MH_OBJECT - Snow Leopard and earlier
268 * 2) 32-bit MH_KEXT_BUNDLE - Lion and Later
269 * 3) 64-bit MH_OBJECT - Unsupported
270 * 4) 64-bit MH_KEXT_BUNDLE - Snow Leopard and Later
273 if (kxld_object_is_32_bit(object
)) {
274 struct mach_header
*mach_hdr
= (struct mach_header
*) ((void *) my_file
);
275 object
->filetype
= mach_hdr
->filetype
;
277 struct mach_header_64
*mach_hdr
= (struct mach_header_64
*) ((void *) my_file
);
278 object
->filetype
= mach_hdr
->filetype
;
281 switch (object
->filetype
) {
282 #if KXLD_USER_OR_BUNDLE
284 rval
= init_from_bundle(object
);
285 require_noerr(rval
, finish
);
287 #endif /* KXLD_USER_OR_BUNDLE */
288 #if KXLD_USER_OR_OBJECT
290 rval
= init_from_object(object
);
291 require_noerr(rval
, finish
);
293 #endif /* KXLD_USER_OR_OBJECT */
295 object
->is_kernel
= TRUE
;
296 rval
= init_from_execute(object
);
297 require_noerr(rval
, finish
);
301 kxld_log(kKxldLogLinking
, kKxldLogErr
,
302 kKxldLogFiletypeNotSupported
, object
->filetype
);
306 if (!kxld_object_is_kernel(object
)) {
307 for (i
= 0; i
< object
->segs
.nitems
; ++i
) {
308 seg
= kxld_array_get_item(&object
->segs
, i
);
309 kxld_seg_set_vm_protections(seg
,
310 target_supports_protected_segments(object
));
313 seg
= kxld_object_get_seg_by_name(object
, SEG_LINKEDIT
);
315 (void) kxld_seg_populate_linkedit(seg
, object
->symtab
,
316 kxld_object_is_32_bit(object
)
318 , &object
->locrelocs
, &object
->extrelocs
,
319 target_supports_slideable_kexts(object
)
321 , isOldInterface
? 0 : object
->splitinfolc
.datasize
326 (void) set_is_object_linked(object
);
333 /*******************************************************************************
334 *******************************************************************************/
336 kxld_object_get_link_info(KXLDObject
*object
)
340 return &object
->split_info
;
344 /*******************************************************************************
345 *******************************************************************************/
347 kxld_object_set_link_info(KXLDObject
*object
, splitKextLinkInfo
*link_info
)
352 object
->split_info
.vmaddr_TEXT
= link_info
->vmaddr_TEXT
;
353 object
->split_info
.vmaddr_TEXT_EXEC
= link_info
->vmaddr_TEXT_EXEC
;
354 object
->split_info
.vmaddr_DATA
= link_info
->vmaddr_DATA
;
355 object
->split_info
.vmaddr_DATA_CONST
= link_info
->vmaddr_DATA_CONST
;
356 object
->split_info
.vmaddr_LLVM_COV
= link_info
->vmaddr_LLVM_COV
;
357 object
->split_info
.vmaddr_LINKEDIT
= link_info
->vmaddr_LINKEDIT
;
362 /*******************************************************************************
363 *******************************************************************************/
365 get_target_machine_info(KXLDObject
*object
, cpu_type_t cputype __unused
,
366 cpu_subtype_t cpusubtype __unused
)
370 /* Because the kernel can only link for its own architecture, we know what
371 * the host and target architectures are at compile time, so we can use
372 * a vastly simplified version of this function.
377 #if defined(__x86_64__)
378 object
->cputype
= CPU_TYPE_X86_64
;
379 /* FIXME: we need clang to provide a __x86_64h__ macro for the sub-type. Using
380 * __AVX2__ is a temporary solution until this is available. */
381 #if defined(__AVX2__)
382 object
->cpusubtype
= CPU_SUBTYPE_X86_64_H
;
384 object
->cpusubtype
= CPU_SUBTYPE_X86_64_ALL
;
388 kxld_log(kKxldLogLinking
, kKxldLogErr
,
389 kKxldLogArchNotSupported
, _mh_execute_header
->cputype
);
390 return KERN_NOT_SUPPORTED
;
391 #endif /* Supported architecture defines */
396 /* User-space must look up the architecture it's running on and the target
397 * architecture at run-time.
400 kern_return_t rval
= KERN_FAILURE
;
401 const NXArchInfo
*host_arch
= NULL
;
405 host_arch
= NXGetLocalArchInfo();
406 require_action(host_arch
, finish
, rval
=KERN_FAILURE
);
408 object
->host_order
= host_arch
->byteorder
;
410 /* If the user did not specify a cputype, use the local architecture.
414 object
->cputype
= cputype
;
415 object
->cpusubtype
= cpusubtype
;
417 object
->cputype
= host_arch
->cputype
;
418 object
->target_order
= object
->host_order
;
420 switch (object
->cputype
) {
422 object
->cpusubtype
= CPU_SUBTYPE_I386_ALL
;
424 case CPU_TYPE_X86_64
:
425 object
->cpusubtype
= CPU_SUBTYPE_X86_64_ALL
;
428 object
->cpusubtype
= CPU_SUBTYPE_ARM_ALL
;
431 object
->cpusubtype
= CPU_SUBTYPE_ARM64_ALL
;
434 object
->cpusubtype
= 0;
439 /* Validate that we support the target architecture and record its
443 switch(object
->cputype
) {
447 case CPU_TYPE_X86_64
:
448 object
->target_order
= NX_LittleEndian
;
451 rval
= KERN_NOT_SUPPORTED
;
452 kxld_log(kKxldLogLinking
, kKxldLogErr
,
453 kKxldLogArchNotSupported
, object
->cputype
);
464 /*******************************************************************************
465 *******************************************************************************/
467 get_macho_slice_for_arch(KXLDObject
*object
, u_char
*file
, u_long size
)
469 kern_return_t rval
= KERN_FAILURE
;
470 struct mach_header
*mach_hdr
= NULL
;
472 struct fat_header
*fat
= (struct fat_header
*) ((void *) file
);
473 struct fat_arch
*archs
= (struct fat_arch
*) &fat
[1];
474 boolean_t swap
= FALSE
;
476 u_char
*my_file
= file
;
477 u_long my_file_size
= size
;
483 /* We are assuming that we will never receive a fat file in the kernel */
486 require_action(size
>= sizeof(*fat
), finish
,
488 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogTruncatedMachO
));
490 /* The fat header is always big endian, so swap if necessary */
491 if (fat
->magic
== FAT_CIGAM
) {
492 (void) swap_fat_header(fat
, object
->host_order
);
496 if (fat
->magic
== FAT_MAGIC
) {
497 struct fat_arch
*arch
= NULL
;
499 require_action(size
>= (sizeof(*fat
) + (fat
->nfat_arch
* sizeof(*archs
))),
502 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogTruncatedMachO
));
504 /* Swap the fat_arch structures if necessary */
506 (void) swap_fat_arch(archs
, fat
->nfat_arch
, object
->host_order
);
509 /* Locate the Mach-O for the requested architecture */
511 arch
= NXFindBestFatArch(object
->cputype
, object
->cpusubtype
, archs
, fat
->nfat_arch
);
512 require_action(arch
, finish
, rval
=KERN_FAILURE
;
513 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogArchNotFound
));
514 require_action(size
>= arch
->offset
+ arch
->size
, finish
,
516 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogTruncatedMachO
));
518 my_file
= my_file
+ arch
->offset
;
519 my_file_size
= arch
->size
;
523 /* Swap the Mach-O's headers to this architecture if necessary */
524 if (kxld_object_is_32_bit(object
)) {
525 rval
= validate_and_swap_macho_32(my_file
, my_file_size
531 rval
= validate_and_swap_macho_64(my_file
, my_file_size
537 require_noerr(rval
, finish
);
539 mach_hdr
= (struct mach_header
*) ((void *) my_file
);
540 require_action(object
->cputype
== mach_hdr
->cputype
, finish
,
542 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogTruncatedMachO
));
543 object
->cpusubtype
= mach_hdr
->cpusubtype
; /* <rdar://problem/16008438> */
545 if (isOldInterface
) {
546 object
->file
= my_file
;
547 object
->size
= my_file_size
;
550 object
->split_info
.kextExecutable
= my_file
;
551 object
->split_info
.kextSize
= my_file_size
;
559 /*******************************************************************************
560 *******************************************************************************/
562 init_from_final_linked_image(KXLDObject
*object
, u_int
*filetype_out
,
563 struct symtab_command
**symtab_hdr_out
)
565 kern_return_t rval
= KERN_FAILURE
;
567 KXLDSect
*sect
= NULL
;
568 struct load_command
*cmd_hdr
= NULL
;
569 struct symtab_command
*symtab_hdr
= NULL
;
570 struct uuid_command
*uuid_hdr
= NULL
;
571 struct version_min_command
*versionmin_hdr
= NULL
;
572 struct source_version_command
*source_version_hdr
= NULL
;
573 u_long base_offset
= 0;
575 u_long sect_offset
= 0;
586 if (isOldInterface
) {
587 my_file
= object
->file
;
590 my_file
= object
->split_info
.kextExecutable
;
593 KXLD_3264_FUNC(kxld_object_is_32_bit(object
), base_offset
,
594 get_macho_cmd_data_32
, get_macho_cmd_data_64
,
595 my_file
, offset
, &filetype
, &ncmds
);
597 /* First pass to count segments and sections */
599 offset
= base_offset
;
600 for (i
= 0; i
< ncmds
; ++i
, offset
+= cmd_hdr
->cmdsize
) {
601 cmd_hdr
= (struct load_command
*) ((void *) (my_file
+ offset
));
603 switch(cmd_hdr
->cmd
) {
604 #if KXLD_USER_OR_ILP32
607 struct segment_command
*seg_hdr
=
608 (struct segment_command
*) cmd_hdr
;
610 /* Ignore segments with no vm size */
611 if (!seg_hdr
->vmsize
) continue;
614 nsects
+= seg_hdr
->nsects
;
617 #endif /* KXLD_USER_OR_ILP32 */
618 #if KXLD_USER_OR_LP64
621 struct segment_command_64
*seg_hdr
=
622 (struct segment_command_64
*) ((void *) cmd_hdr
);
624 /* Ignore segments with no vm size */
625 if (!seg_hdr
->vmsize
) continue;
628 nsects
+= seg_hdr
->nsects
;
631 #endif /* KXLD_USER_OR_LP64 */
637 /* Allocate the segments and sections */
640 rval
= kxld_array_init(&object
->segs
, sizeof(KXLDSeg
), nsegs
);
641 require_noerr(rval
, finish
);
643 rval
= kxld_array_init(&object
->sects
, sizeof(KXLDSect
), nsects
);
644 require_noerr(rval
, finish
);
647 /* Initialize the segments and sections */
649 offset
= base_offset
;
650 for (i
= 0; i
< ncmds
; ++i
, offset
+= cmd_hdr
->cmdsize
) {
651 cmd_hdr
= (struct load_command
*) ((void *) (my_file
+ offset
));
654 switch(cmd_hdr
->cmd
) {
655 #if KXLD_USER_OR_ILP32
658 struct segment_command
*seg_hdr
=
659 (struct segment_command
*) cmd_hdr
;
661 /* Ignore segments with no vm size */
662 if (!seg_hdr
->vmsize
) continue;
664 seg
= kxld_array_get_item(&object
->segs
, segi
++);
666 rval
= kxld_seg_init_from_macho_32(seg
, seg_hdr
);
667 require_noerr(rval
, finish
);
669 sect_offset
= offset
+ sizeof(*seg_hdr
);
672 #endif /* KXLD_USER_OR_ILP32 */
673 #if KXLD_USER_OR_LP64
676 struct segment_command_64
*seg_hdr
=
677 (struct segment_command_64
*) ((void *) cmd_hdr
);
679 /* Ignore segments with no vm size */
680 if (!seg_hdr
->vmsize
) continue;
682 seg
= kxld_array_get_item(&object
->segs
, segi
++);
684 rval
= kxld_seg_init_from_macho_64(seg
, seg_hdr
);
685 require_noerr(rval
, finish
);
687 sect_offset
= offset
+ sizeof(*seg_hdr
);
690 #endif /* KXLD_USER_OR_LP64 */
692 symtab_hdr
= (struct symtab_command
*) cmd_hdr
;
695 uuid_hdr
= (struct uuid_command
*) cmd_hdr
;
696 kxld_uuid_init_from_macho(&object
->uuid
, uuid_hdr
);
698 case LC_VERSION_MIN_MACOSX
:
699 case LC_VERSION_MIN_IPHONEOS
:
700 case LC_VERSION_MIN_TVOS
:
701 case LC_VERSION_MIN_WATCHOS
:
702 versionmin_hdr
= (struct version_min_command
*) cmd_hdr
;
703 kxld_versionmin_init_from_macho(&object
->versionmin
, versionmin_hdr
);
705 case LC_SOURCE_VERSION
:
706 source_version_hdr
= (struct source_version_command
*) (void *) cmd_hdr
;
707 kxld_srcversion_init_from_macho(&object
->srcversion
, source_version_hdr
);
710 object
->dysymtab_hdr
= (struct dysymtab_command
*) cmd_hdr
;
711 rval
= kxld_reloc_create_macho(&object
->extrelocs
, &object
->relocator
,
712 (struct relocation_info
*) ((void *) (my_file
+ object
->dysymtab_hdr
->extreloff
)),
713 object
->dysymtab_hdr
->nextrel
);
714 require_noerr(rval
, finish
);
716 rval
= kxld_reloc_create_macho(&object
->locrelocs
, &object
->relocator
,
717 (struct relocation_info
*) ((void *) (my_file
+ object
->dysymtab_hdr
->locreloff
)),
718 object
->dysymtab_hdr
->nlocrel
);
719 require_noerr(rval
, finish
);
724 /* Don't need to do anything with UNIXTHREAD or MAIN for the kernel */
725 require_action(kxld_object_is_kernel(object
),
726 finish
, rval
=KERN_FAILURE
;
727 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
728 "LC_UNIXTHREAD/LC_MAIN segment is not valid in a kext."));
730 case LC_SEGMENT_SPLIT_INFO
:
732 struct linkedit_data_command
*split_info_hdr
= NULL
;
733 split_info_hdr
= (struct linkedit_data_command
*) (void *) cmd_hdr
;
734 kxld_splitinfolc_init_from_macho(&object
->splitinfolc
, split_info_hdr
);
737 case LC_CODE_SIGNATURE
:
739 case LC_DYLD_INFO_ONLY
:
740 case LC_FUNCTION_STARTS
:
741 case LC_DATA_IN_CODE
:
742 case LC_DYLIB_CODE_SIGN_DRS
:
743 /* Various metadata that might be stored in the linkedit segment */
747 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
748 "Invalid load command type in MH_KEXT_BUNDLE kext: %u.", cmd_hdr
->cmd
);
754 /* Initialize the sections */
755 for (j
= 0; j
< seg
->sects
.nitems
; ++j
, ++secti
) {
756 sect
= kxld_array_get_item(&object
->sects
, secti
);
758 KXLD_3264_FUNC(kxld_object_is_32_bit(object
), rval
,
759 kxld_sect_init_from_macho_32
, kxld_sect_init_from_macho_64
,
760 sect
, my_file
, §_offset
, secti
, &object
->relocator
);
761 require_noerr(rval
, finish
);
763 /* Add the section to the segment. This will also make sure
764 * that the sections and segments have the same segname.
766 rval
= kxld_seg_add_section(seg
, sect
);
767 require_noerr(rval
, finish
);
769 rval
= kxld_seg_finish_init(seg
);
770 require_noerr(rval
, finish
);
774 if (filetype_out
) *filetype_out
= filetype
;
775 if (symtab_hdr_out
) *symtab_hdr_out
= symtab_hdr
;
776 object
->is_final_image
= TRUE
;
782 /*******************************************************************************
783 *******************************************************************************/
785 init_from_execute(KXLDObject
*object
)
787 kern_return_t rval
= KERN_FAILURE
;
788 struct symtab_command
*symtab_hdr
= NULL
;
790 KXLDSeg
* kernel_linkedit_seg
= NULL
; // used if running kernel
791 #if KXLD_USER_OR_OBJECT
793 KXLDSect
*sect
= NULL
;
794 KXLDSectionName
*sname
= NULL
;
795 u_int i
= 0, j
= 0, k
= 0;
796 #endif /* KXLD_USER_OR_OBJECT */
801 if (isOldInterface
) {
802 my_file
= object
->file
;
805 my_file
= object
->split_info
.kextExecutable
;
808 require_action(kxld_object_is_kernel(object
), finish
, rval
=KERN_FAILURE
);
810 rval
= init_from_final_linked_image(object
, &filetype
, &symtab_hdr
);
811 require_noerr(rval
, finish
);
813 require_action(filetype
== MH_EXECUTE
, finish
, rval
=KERN_FAILURE
;
814 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
815 "The kernel file is not of type MH_EXECUTE."));
817 /* Initialize the symbol table. If this is the running kernel
818 * we will work from the in-memory linkedit segment;
819 * otherwise we work from the whole mach-o image.
822 kernel_linkedit_seg
= kxld_object_get_seg_by_name(object
, SEG_LINKEDIT
);
823 require_action(kernel_linkedit_seg
, finish
, rval
=KERN_FAILURE
;
824 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
));
827 KXLD_3264_FUNC(kxld_object_is_32_bit(object
), rval
,
828 kxld_symtab_init_from_macho_32
, kxld_symtab_init_from_macho_64
,
829 object
->symtab
, symtab_hdr
, my_file
, kernel_linkedit_seg
);
830 require_noerr(rval
, finish
);
832 #if KXLD_USER_OR_OBJECT
833 /* Save off the order of section names so that we can lay out kext
834 * sections for MH_OBJECT-based systems.
836 if (target_supports_object(object
)) {
838 rval
= kxld_array_init(object
->section_order
, sizeof(KXLDSectionName
),
839 object
->sects
.nitems
);
840 require_noerr(rval
, finish
);
842 /* Copy the section names into the section_order array for future kext
845 for (i
= 0, k
= 0; i
< object
->segs
.nitems
; ++i
) {
846 seg
= kxld_array_get_item(&object
->segs
, i
);
848 for (j
= 0; j
< seg
->sects
.nitems
; ++j
, ++k
) {
849 sect
= *(KXLDSect
**) kxld_array_get_item(&seg
->sects
, j
);
850 sname
= kxld_array_get_item(object
->section_order
, k
);
852 strlcpy(sname
->segname
, sect
->segname
, sizeof(sname
->segname
));
853 strlcpy(sname
->sectname
, sect
->sectname
, sizeof(sname
->sectname
));
857 #endif /* KXLD_USER_OR_OBJECT */
864 #if KXLD_USER_OR_BUNDLE
865 /*******************************************************************************
866 *******************************************************************************/
868 target_supports_bundle(const KXLDObject
*object __unused
)
873 /*******************************************************************************
874 *******************************************************************************/
876 init_from_bundle(KXLDObject
*object
)
878 kern_return_t rval
= KERN_FAILURE
;
879 struct symtab_command
*symtab_hdr
= NULL
;
885 if (isOldInterface
) {
886 my_file
= object
->file
;
889 my_file
= object
->split_info
.kextExecutable
;
892 require_action(target_supports_bundle(object
), finish
,
894 kxld_log(kKxldLogLinking
, kKxldLogErr
,
895 kKxldLogFiletypeNotSupported
, MH_KEXT_BUNDLE
));
897 rval
= init_from_final_linked_image(object
, &filetype
, &symtab_hdr
);
898 require_noerr(rval
, finish
);
900 require_action(filetype
== MH_KEXT_BUNDLE
, finish
,
903 KXLD_3264_FUNC(kxld_object_is_32_bit(object
), rval
,
904 kxld_symtab_init_from_macho_32
, kxld_symtab_init_from_macho_64
,
905 object
->symtab
, symtab_hdr
, my_file
,
906 /* kernel_linkedit_seg */ NULL
);
907 require_noerr(rval
, finish
);
913 #endif /* KXLD_USER_OR_BUNDLE */
915 #if KXLD_USER_OR_OBJECT
916 /*******************************************************************************
917 *******************************************************************************/
918 static boolean_t
target_supports_object(const KXLDObject
*object
)
920 return (object
->cputype
== CPU_TYPE_I386
);
923 /*******************************************************************************
924 *******************************************************************************/
926 init_from_object(KXLDObject
*object
)
928 kern_return_t rval
= KERN_FAILURE
;
929 struct load_command
*cmd_hdr
= NULL
;
930 struct symtab_command
*symtab_hdr
= NULL
;
931 struct uuid_command
*uuid_hdr
= NULL
;
932 KXLDSect
*sect
= NULL
;
934 u_long sect_offset
= 0;
939 boolean_t has_segment
= FALSE
;
944 if (isOldInterface
) {
945 my_file
= object
->file
;
948 my_file
= object
->split_info
.kextExecutable
;
951 require_action(target_supports_object(object
),
952 finish
, rval
=KERN_FAILURE
;
953 kxld_log(kKxldLogLinking
, kKxldLogErr
,
954 kKxldLogFiletypeNotSupported
, MH_OBJECT
));
956 KXLD_3264_FUNC(kxld_object_is_32_bit(object
), offset
,
957 get_macho_cmd_data_32
, get_macho_cmd_data_64
,
958 my_file
, offset
, &filetype
, &ncmds
);
960 require_action(filetype
== MH_OBJECT
, finish
, rval
=KERN_FAILURE
);
962 /* MH_OBJECTs use one unnamed segment to contain all of the sections. We
963 * loop over all of the load commands to initialize the structures we
964 * expect. Then, we'll use the unnamed segment to get to all of the
965 * sections, and then use those sections to create the actual segments.
968 for (; i
< ncmds
; ++i
, offset
+= cmd_hdr
->cmdsize
) {
969 cmd_hdr
= (struct load_command
*) ((void *) (my_file
+ offset
));
971 switch(cmd_hdr
->cmd
) {
972 #if KXLD_USER_OR_ILP32
975 struct segment_command
*seg_hdr
=
976 (struct segment_command
*) cmd_hdr
;
978 /* Ignore segments with no vm size */
979 if (!seg_hdr
->vmsize
) continue;
981 /* Ignore LINKEDIT segments */
982 if (streq_safe(seg_hdr
->segname
, SEG_LINKEDIT
,
983 const_strlen(SEG_LINKEDIT
)))
988 require_action(kxld_object_is_32_bit(object
), finish
, rval
=KERN_FAILURE
;
989 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
990 "LC_SEGMENT in 64-bit kext."));
991 require_action(!has_segment
, finish
, rval
=KERN_FAILURE
;
992 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
993 "Multiple segments in an MH_OBJECT kext."));
995 nsects
= seg_hdr
->nsects
;
996 sect_offset
= offset
+ sizeof(*seg_hdr
);
1000 #endif /* KXLD_USER_OR_ILP32 */
1001 #if KXLD_USER_OR_LP64
1004 struct segment_command_64
*seg_hdr
=
1005 (struct segment_command_64
*) ((void *) cmd_hdr
);
1007 /* Ignore segments with no vm size */
1008 if (!seg_hdr
->vmsize
) continue;
1010 /* Ignore LINKEDIT segments */
1011 if (streq_safe(seg_hdr
->segname
, SEG_LINKEDIT
,
1012 const_strlen(SEG_LINKEDIT
)))
1017 require_action(!kxld_object_is_32_bit(object
), finish
, rval
=KERN_FAILURE
;
1018 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
1019 "LC_SEGMENT_64 in a 32-bit kext."));
1020 require_action(!has_segment
, finish
, rval
=KERN_FAILURE
;
1021 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
1022 "Multiple segments in an MH_OBJECT kext."));
1024 nsects
= seg_hdr
->nsects
;
1025 sect_offset
= offset
+ sizeof(*seg_hdr
);
1029 #endif /* KXLD_USER_OR_LP64 */
1031 symtab_hdr
= (struct symtab_command
*) cmd_hdr
;
1033 KXLD_3264_FUNC(kxld_object_is_32_bit(object
), rval
,
1034 kxld_symtab_init_from_macho_32
, kxld_symtab_init_from_macho_64
,
1035 object
->symtab
, symtab_hdr
, my_file
,
1036 /* kernel_linkedit_seg */ NULL
);
1037 require_noerr(rval
, finish
);
1040 uuid_hdr
= (struct uuid_command
*) cmd_hdr
;
1041 kxld_uuid_init_from_macho(&object
->uuid
, uuid_hdr
);
1045 /* Don't need to do anything with UNIXTHREAD or MAIN */
1047 case LC_CODE_SIGNATURE
:
1049 case LC_DYLD_INFO_ONLY
:
1050 case LC_FUNCTION_STARTS
:
1051 case LC_DATA_IN_CODE
:
1052 case LC_DYLIB_CODE_SIGN_DRS
:
1053 /* Various metadata that might be stored in the linkedit segment */
1055 case LC_VERSION_MIN_MACOSX
:
1056 case LC_VERSION_MIN_IPHONEOS
:
1057 case LC_VERSION_MIN_TVOS
:
1058 case LC_VERSION_MIN_WATCHOS
:
1059 case LC_SOURCE_VERSION
:
1060 /* Not supported for object files, fall through */
1062 rval
= KERN_FAILURE
;
1063 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
1064 "Invalid load command type in MH_OBJECT kext: %u.", cmd_hdr
->cmd
);
1071 /* Get the number of sections from the segment and build the section index */
1073 rval
= kxld_array_init(&object
->sects
, sizeof(KXLDSect
), nsects
);
1074 require_noerr(rval
, finish
);
1076 /* Loop over all of the sections to initialize the section index */
1078 for (i
= 0; i
< nsects
; ++i
) {
1079 sect
= kxld_array_get_item(&object
->sects
, i
);
1081 KXLD_3264_FUNC(kxld_object_is_32_bit(object
), rval
,
1082 kxld_sect_init_from_macho_32
, kxld_sect_init_from_macho_64
,
1083 sect
, my_file
, §_offset
, i
, &object
->relocator
);
1084 require_noerr(rval
, finish
);
1087 /* Create special sections */
1089 #if KXLD_USER_OR_GOT
1090 rval
= create_got(object
);
1091 require_noerr(rval
, finish
);
1092 #endif /* KXLD_USER_OR_GOT */
1094 #if KXLD_USER_OR_COMMON
1095 rval
= resolve_common_symbols(object
);
1096 require_noerr(rval
, finish
);
1097 #endif /* KXLD_USER_OR_COMMON */
1099 /* Create the segments from the section index */
1101 rval
= kxld_seg_create_seg_from_sections(&object
->segs
, &object
->sects
);
1102 require_noerr(rval
, finish
);
1104 rval
= kxld_seg_finalize_object_segment(&object
->segs
,
1105 object
->section_order
, get_macho_header_size(object
));
1106 require_noerr(rval
, finish
);
1108 rval
= kxld_seg_init_linkedit(&object
->segs
);
1109 require_noerr(rval
, finish
);
1112 rval
= KERN_SUCCESS
;
1116 #endif /* KXLD_USER_OR_OBJECT */
1118 #if KXLD_USER_OR_ILP32
1119 /*******************************************************************************
1120 *******************************************************************************/
1122 get_macho_cmd_data_32(u_char
*file
, u_long offset
, u_int
*filetype
, u_int
*ncmds
)
1124 struct mach_header
*mach_hdr
= (struct mach_header
*) ((void *) (file
+ offset
));
1126 if (filetype
) *filetype
= mach_hdr
->filetype
;
1127 if (ncmds
) *ncmds
= mach_hdr
->ncmds
;
1129 return sizeof(*mach_hdr
);
1132 #endif /* KXLD_USER_OR_ILP32 */
1134 #if KXLD_USER_OR_LP64
1135 /*******************************************************************************
1136 *******************************************************************************/
1138 get_macho_cmd_data_64(u_char
*file
, u_long offset
, u_int
*filetype
, u_int
*ncmds
)
1140 struct mach_header_64
*mach_hdr
= (struct mach_header_64
*) ((void *) (file
+ offset
));
1142 if (filetype
) *filetype
= mach_hdr
->filetype
;
1143 if (ncmds
) *ncmds
= mach_hdr
->ncmds
;
1145 return sizeof(*mach_hdr
);
1147 #endif /* KXLD_USER_OR_LP64 */
1149 /*******************************************************************************
1150 *******************************************************************************/
1152 get_macho_header_size(const KXLDObject
*object
)
1154 KXLDSeg
*seg
= NULL
;
1155 u_long header_size
= 0;
1157 boolean_t object_is_32_bit
= kxld_object_is_32_bit(object
);
1161 /* Mach, segment, symtab, and UUID headers */
1163 header_size
+= object_is_32_bit
? sizeof(struct mach_header
) : sizeof(struct mach_header_64
);
1165 for (i
= 0; i
< object
->segs
.nitems
; ++i
) {
1166 seg
= kxld_array_get_item(&object
->segs
, i
);
1167 header_size
+= kxld_seg_get_macho_header_size(seg
, object_is_32_bit
);
1170 header_size
+= kxld_symtab_get_macho_header_size();
1173 if (target_supports_slideable_kexts(object
)) {
1174 header_size
+= kxld_reloc_get_macho_header_size();
1176 #endif /* KXLD_PIC_KEXTS */
1178 if (object
->uuid
.has_uuid
) {
1179 header_size
+= kxld_uuid_get_macho_header_size();
1182 if (object
->versionmin
.has_versionmin
) {
1183 header_size
+= kxld_versionmin_get_macho_header_size();
1186 if (object
->srcversion
.has_srcversion
) {
1187 header_size
+= kxld_srcversion_get_macho_header_size();
1190 if (isSplitKext
&& object
->splitinfolc
.has_splitinfolc
) {
1191 header_size
+= kxld_splitinfolc_get_macho_header_size();
1197 /*******************************************************************************
1198 *******************************************************************************/
1200 get_macho_data_size(const KXLDObject
*object
)
1202 KXLDSeg
*seg
= NULL
;
1203 u_long data_size
= 0;
1208 /* total all segment vmsize values */
1209 for (i
= 0; i
< object
->segs
.nitems
; ++i
) {
1210 seg
= kxld_array_get_item(&object
->segs
, i
);
1211 data_size
+= (u_long
) kxld_seg_get_vmsize(seg
);
1216 /* ensure that when we eventually emit the final linked object,
1217 * appending the __DYSYMTAB data after the __LINKEDIT data will
1218 * not overflow the space allocated for the __LINKEDIT segment
1221 u_long seg_vmsize
= 0;
1222 u_long symtab_size
= 0;
1223 u_long reloc_size
= 0;
1225 /* get current __LINKEDIT sizes */
1226 seg
= kxld_object_get_seg_by_name(object
, SEG_LINKEDIT
);
1228 seg_vmsize
= (u_long
) kxld_seg_get_vmsize(seg
);
1230 /* get size of symbol table data that will eventually be dumped
1231 * into the __LINKEDIT segment
1233 symtab_size
= kxld_symtab_get_macho_data_size(object
->symtab
, kxld_object_is_32_bit(object
));
1235 if (target_supports_slideable_kexts(object
)) {
1236 /* get size of __DYSYMTAB relocation entries */
1237 reloc_size
= kxld_reloc_get_macho_data_size(&object
->locrelocs
, &object
->extrelocs
);
1240 /* combine, and ensure they'll both fit within the page(s)
1241 * allocated for the __LINKEDIT segment. If they'd overflow,
1242 * increase the vmsize appropriately so no overflow will occur
1244 if ((symtab_size
+ reloc_size
) > seg_vmsize
) {
1245 u_long overflow
= (symtab_size
+ reloc_size
) - seg_vmsize
;
1246 data_size
+= kxld_round_page_cross_safe(overflow
);
1249 #endif // KXLD_PIC_KEXTS
1254 /*******************************************************************************
1255 *******************************************************************************/
1257 kxld_object_target_needs_swap(const KXLDObject
*object __unused
)
1262 return (object
->target_order
!= object
->host_order
);
1266 /*******************************************************************************
1267 *******************************************************************************/
1269 kxld_object_get_seg_by_name(const KXLDObject
*object
, const char *segname
)
1271 KXLDSeg
*seg
= NULL
;
1274 for (i
= 0; i
< object
->segs
.nitems
; ++i
) {
1275 seg
= kxld_array_get_item(&object
->segs
, i
);
1277 if (streq_safe(segname
, seg
->segname
, sizeof(seg
->segname
))) break;
1285 /*******************************************************************************
1286 *******************************************************************************/
1287 const KXLDRelocator
*
1288 kxld_object_get_relocator(const KXLDObject
* object
)
1292 return &object
->relocator
;
1295 /*******************************************************************************
1296 *******************************************************************************/
1298 kxld_object_get_sect_by_name(const KXLDObject
*object
, const char *segname
,
1299 const char *sectname
)
1301 KXLDSect
*sect
= NULL
;
1304 for (i
= 0; i
< object
->sects
.nitems
; ++i
) {
1305 sect
= kxld_array_get_item(&object
->sects
, i
);
1307 if (streq_safe(segname
, sect
->segname
, sizeof(sect
->segname
)) &&
1308 streq_safe(sectname
, sect
->sectname
, sizeof(sect
->sectname
)))
1319 /*******************************************************************************
1320 *******************************************************************************/
1322 kxld_object_get_reloc_at_symbol(const KXLDObject
*object
, const KXLDSym
*sym
)
1324 const KXLDReloc
*reloc
= NULL
;
1325 const KXLDSect
*sect
= NULL
;
1326 uint32_t offset
= 0;
1331 sect
= kxld_object_get_section_by_index(object
, sym
->sectnum
);
1332 require(sect
, finish
);
1334 if (kxld_object_is_final_image(object
)) {
1335 reloc
= kxld_reloc_get_reloc_by_offset(&object
->extrelocs
,
1338 reloc
= kxld_reloc_get_reloc_by_offset(&object
->locrelocs
,
1342 offset
= kxld_sym_get_section_offset(sym
, sect
);
1343 reloc
= kxld_reloc_get_reloc_by_offset(§
->relocs
, offset
);
1350 /*******************************************************************************
1351 *******************************************************************************/
1353 kxld_object_get_symbol_of_reloc(const KXLDObject
*object
,
1354 const KXLDReloc
*reloc
, const KXLDSect
*sect
)
1356 const KXLDSym
*sym
= NULL
;
1359 if (isOldInterface
) {
1360 my_file
= object
->file
;
1363 my_file
= object
->split_info
.kextExecutable
;
1366 if (kxld_object_is_final_image(object
)) {
1367 sym
= kxld_reloc_get_symbol(&object
->relocator
, reloc
, my_file
);
1369 sym
= kxld_reloc_get_symbol(&object
->relocator
, reloc
, sect
->data
);
1374 /*******************************************************************************
1375 *******************************************************************************/
1377 kxld_object_get_section_by_index(const KXLDObject
*object
, u_int sectnum
)
1379 KXLDSect
*sect
= NULL
;
1383 if (sectnum
< object
->sects
.nitems
) {
1384 sect
= kxld_array_get_item(&object
->sects
, sectnum
);
1390 /*******************************************************************************
1391 *******************************************************************************/
1393 kxld_object_get_extrelocs(const KXLDObject
*object
)
1395 const KXLDArray
*rval
= NULL
;
1399 if (kxld_object_is_final_image(object
)) {
1400 rval
= &object
->extrelocs
;
1406 /*******************************************************************************
1407 *******************************************************************************/
1409 kxld_object_get_symtab(const KXLDObject
*object
)
1413 return object
->symtab
;
1416 #if KXLD_USER_OR_GOT || KXLD_USER_OR_COMMON
1417 /*******************************************************************************
1418 *******************************************************************************/
1419 static kern_return_t
1420 add_section(KXLDObject
*object
, KXLDSect
**sect
)
1422 kern_return_t rval
= KERN_FAILURE
;
1423 u_int nsects
= object
->sects
.nitems
;
1425 rval
= kxld_array_resize(&object
->sects
, nsects
+ 1);
1426 require_noerr(rval
, finish
);
1428 *sect
= kxld_array_get_item(&object
->sects
, nsects
);
1430 rval
= KERN_SUCCESS
;
1435 #endif /* KXLD_USER_OR_GOT || KXLD_USER_OR_COMMON */
1437 #if KXLD_USER_OR_COMMON
1438 /*******************************************************************************
1439 * If there are common symbols, calculate how much space they'll need
1440 * and create/grow the __DATA __common section to accommodate them.
1441 * Then, resolve them against that section.
1442 *******************************************************************************/
1443 static kern_return_t
1444 resolve_common_symbols(KXLDObject
*object
)
1446 kern_return_t rval
= KERN_FAILURE
;
1447 KXLDSymtabIterator iter
;
1448 KXLDSym
*sym
= NULL
;
1449 KXLDSect
*sect
= NULL
;
1450 kxld_addr_t base_addr
= 0;
1451 kxld_size_t size
= 0;
1452 kxld_size_t total_size
= 0;
1454 u_int max_align
= 0;
1457 if (!kxld_object_target_supports_common_symbols(object
)) {
1458 rval
= KERN_SUCCESS
;
1462 /* Iterate over the common symbols to calculate their total aligned size */
1463 kxld_symtab_iterator_init(&iter
, object
->symtab
, kxld_sym_is_common
, FALSE
);
1464 while ((sym
= kxld_symtab_iterator_get_next(&iter
))) {
1465 align
= kxld_sym_get_common_align(sym
);
1466 size
= kxld_sym_get_common_size(sym
);
1468 if (align
> max_align
) max_align
= align
;
1470 total_size
= kxld_align_address(total_size
, align
) + size
;
1473 /* If there are common symbols, grow or create the __DATA __common section
1477 sect
= kxld_object_get_sect_by_name(object
, SEG_DATA
, SECT_COMMON
);
1479 base_addr
= sect
->base_addr
+ sect
->size
;
1481 kxld_sect_grow(sect
, total_size
, max_align
);
1485 rval
= add_section(object
, §
);
1486 require_noerr(rval
, finish
);
1488 kxld_sect_init_zerofill(sect
, SEG_DATA
, SECT_COMMON
,
1489 total_size
, max_align
);
1492 /* Resolve the common symbols against the new section */
1493 rval
= kxld_array_get_index(&object
->sects
, sect
, §num
);
1494 require_noerr(rval
, finish
);
1496 kxld_symtab_iterator_reset(&iter
);
1497 while ((sym
= kxld_symtab_iterator_get_next(&iter
))) {
1498 align
= kxld_sym_get_common_align(sym
);
1499 size
= kxld_sym_get_common_size(sym
);
1501 base_addr
= kxld_align_address(base_addr
, align
);
1502 kxld_sym_resolve_common(sym
, sectnum
, base_addr
);
1508 rval
= KERN_SUCCESS
;
1513 #endif /* KXLD_USER_OR_COMMON */
1515 #if KXLD_USER_OR_GOT
1516 /*******************************************************************************
1517 *******************************************************************************/
1519 target_has_got(const KXLDObject
*object
)
1524 /*******************************************************************************
1525 * Create and initialize the Global Offset Table
1526 *******************************************************************************/
1527 static kern_return_t
1528 create_got(KXLDObject
*object
)
1530 kern_return_t rval
= KERN_FAILURE
;
1531 KXLDSect
*sect
= NULL
;
1535 if (!target_has_got(object
)) {
1536 rval
= KERN_SUCCESS
;
1540 for (i
= 0; i
< object
->sects
.nitems
; ++i
) {
1541 sect
= kxld_array_get_item(&object
->sects
, i
);
1542 ngots
+= kxld_sect_get_ngots(sect
, &object
->relocator
,
1546 rval
= add_section(object
, §
);
1547 require_noerr(rval
, finish
);
1549 rval
= kxld_sect_init_got(sect
, ngots
);
1550 require_noerr(rval
, finish
);
1552 object
->got_is_created
= TRUE
;
1553 rval
= KERN_SUCCESS
;
1559 /*******************************************************************************
1560 *******************************************************************************/
1561 static kern_return_t
1562 populate_got(KXLDObject
*object
)
1564 kern_return_t rval
= KERN_FAILURE
;
1565 KXLDSect
*sect
= NULL
;
1568 if (!target_has_got(object
) || !object
->got_is_created
) {
1569 rval
= KERN_SUCCESS
;
1573 for (i
= 0; i
< object
->sects
.nitems
; ++i
) {
1574 sect
= kxld_array_get_item(&object
->sects
, i
);
1575 if (streq_safe(sect
->segname
, KXLD_SEG_GOT
, sizeof(KXLD_SEG_GOT
)) &&
1576 streq_safe(sect
->sectname
, KXLD_SECT_GOT
, sizeof(KXLD_SECT_GOT
)))
1578 kxld_sect_populate_got(sect
, object
->symtab
,
1579 kxld_object_target_needs_swap(object
));
1584 require_action(i
< object
->sects
.nitems
, finish
, rval
=KXLD_MISSING_GOT
);
1586 rval
= KERN_SUCCESS
;
1591 #endif /* KXLD_USER_OR_GOT */
1593 /*******************************************************************************
1594 *******************************************************************************/
1596 target_supports_protected_segments(const KXLDObject
*object
)
1598 return (object
->is_final_image
&&
1599 (object
->cputype
== CPU_TYPE_X86_64
||
1600 object
->cputype
== CPU_TYPE_ARM
||
1601 object
->cputype
== CPU_TYPE_ARM64
));
1604 /*******************************************************************************
1605 *******************************************************************************/
1607 set_is_object_linked(KXLDObject
*object
)
1611 if (kxld_object_is_kernel(object
)) {
1612 object
->is_linked
= TRUE
;
1616 if (object
->is_final_image
) {
1617 object
->is_linked
= !object
->extrelocs
.nitems
;
1621 object
->is_linked
= TRUE
;
1622 for (i
= 0; i
< object
->sects
.nitems
; ++i
) {
1623 KXLDSect
*sect
= kxld_array_get_item(&object
->sects
, i
);
1624 if (sect
->relocs
.nitems
) {
1625 object
->is_linked
= FALSE
;
1632 /*******************************************************************************
1633 *******************************************************************************/
1634 void kxld_object_clear(KXLDObject
*object
)
1636 KXLDSeg
*seg
= NULL
;
1637 KXLDSect
*sect
= NULL
;
1643 if (isOldInterface
) {
1644 my_file
= object
->file
;
1647 my_file
= object
->split_info
.kextExecutable
;
1651 if (kxld_object_is_kernel(object
)) {
1652 unswap_macho(my_file
, object
->host_order
, object
->target_order
);
1654 #endif /* !KERNEL */
1656 for (i
= 0; i
< object
->segs
.nitems
; ++i
) {
1657 seg
= kxld_array_get_item(&object
->segs
, i
);
1658 kxld_seg_clear(seg
);
1660 kxld_array_reset(&object
->segs
);
1662 for (i
= 0; i
< object
->sects
.nitems
; ++i
) {
1663 sect
= kxld_array_get_item(&object
->sects
, i
);
1664 kxld_sect_clear(sect
);
1666 kxld_array_reset(&object
->sects
);
1668 kxld_array_reset(&object
->extrelocs
);
1669 kxld_array_reset(&object
->locrelocs
);
1670 kxld_relocator_clear(&object
->relocator
);
1671 kxld_uuid_clear(&object
->uuid
);
1672 kxld_versionmin_clear(&object
->versionmin
);
1673 kxld_srcversion_clear(&object
->srcversion
);
1675 if (object
->symtab
) kxld_symtab_clear(object
->symtab
);
1677 if (isOldInterface
) {
1678 object
->file
= NULL
;
1682 kxld_splitinfolc_clear(&object
->splitinfolc
);
1683 object
->split_info
.kextExecutable
= NULL
;
1684 object
->split_info
.kextSize
= 0;
1686 object
->filetype
= 0;
1687 object
->cputype
= 0;
1688 object
->cpusubtype
= 0;
1689 object
->is_kernel
= FALSE
;
1690 object
->is_final_image
= FALSE
;
1691 object
->is_linked
= FALSE
;
1692 object
->got_is_created
= FALSE
;
1694 #if KXLD_USER_OR_OBJECT
1695 object
->section_order
= NULL
;
1698 object
->host_order
= 0;
1699 object
->target_order
= 0;
1703 /*******************************************************************************
1704 *******************************************************************************/
1705 void kxld_object_deinit(KXLDObject
*object __unused
)
1707 KXLDSeg
*seg
= NULL
;
1708 KXLDSect
*sect
= NULL
;
1714 if (isOldInterface
) {
1715 my_file
= object
->file
;
1718 my_file
= object
->split_info
.kextExecutable
;
1722 if (my_file
&& kxld_object_is_kernel(object
)) {
1723 unswap_macho(my_file
, object
->host_order
, object
->target_order
);
1725 #endif /* !KERNEL */
1727 for (i
= 0; i
< object
->segs
.maxitems
; ++i
) {
1728 seg
= kxld_array_get_slot(&object
->segs
, i
);
1729 kxld_seg_deinit(seg
);
1731 kxld_array_deinit(&object
->segs
);
1733 for (i
= 0; i
< object
->sects
.maxitems
; ++i
) {
1734 sect
= kxld_array_get_slot(&object
->sects
, i
);
1735 kxld_sect_deinit(sect
);
1737 kxld_array_deinit(&object
->sects
);
1739 kxld_array_deinit(&object
->extrelocs
);
1740 kxld_array_deinit(&object
->locrelocs
);
1742 if (object
->symtab
) {
1743 kxld_symtab_deinit(object
->symtab
);
1744 kxld_free(object
->symtab
, kxld_symtab_sizeof());
1747 bzero(object
, sizeof(*object
));
1750 /*******************************************************************************
1751 *******************************************************************************/
1753 kxld_object_get_file(const KXLDObject
*object
)
1755 const u_char
*my_file
;
1759 if (isOldInterface
) {
1760 my_file
= object
->file
;
1763 my_file
= object
->split_info
.kextExecutable
;
1769 /*******************************************************************************
1770 *******************************************************************************/
1772 kxld_object_get_name(const KXLDObject
*object
)
1776 return object
->name
;
1779 /*******************************************************************************
1780 *******************************************************************************/
1782 kxld_object_is_32_bit(const KXLDObject
*object
)
1786 return kxld_is_32_bit(object
->cputype
);
1789 /*******************************************************************************
1790 *******************************************************************************/
1792 kxld_object_is_final_image(const KXLDObject
*object
)
1796 return object
->is_final_image
;
1799 /*******************************************************************************
1800 *******************************************************************************/
1802 kxld_object_is_kernel(const KXLDObject
*object
)
1806 return object
->is_kernel
;
1809 /*******************************************************************************
1810 *******************************************************************************/
1812 kxld_object_is_linked(const KXLDObject
*object
)
1816 return object
->is_linked
;
1819 /*******************************************************************************
1820 *******************************************************************************/
1822 kxld_object_target_supports_strict_patching(const KXLDObject
*object
)
1826 return (object
->cputype
!= CPU_TYPE_I386
);
1829 /*******************************************************************************
1830 *******************************************************************************/
1832 kxld_object_target_supports_common_symbols(const KXLDObject
*object
)
1836 return (object
->cputype
== CPU_TYPE_I386
);
1840 /*******************************************************************************
1841 *******************************************************************************/
1843 kxld_object_get_vmsize_for_seg_by_name(const KXLDObject
*object
,
1844 const char *segname
,
1851 KXLDSeg
*seg
= NULL
;
1854 /* segment vmsize */
1855 seg
= kxld_object_get_seg_by_name(object
, segname
);
1857 my_size
= (u_long
) kxld_seg_get_vmsize(seg
);
1860 if (kxld_seg_is_linkedit_seg(seg
))
1862 u_long reloc_size
= 0;
1864 if (target_supports_slideable_kexts(object
)) {
1865 /* get size of __DYSYMTAB relocation entries */
1866 reloc_size
= kxld_reloc_get_macho_data_size(&object
->locrelocs
, &object
->extrelocs
);
1867 my_size
+= reloc_size
;
1875 /*******************************************************************************
1876 *******************************************************************************/
1878 kxld_object_get_vmsize(const KXLDObject
*object
, u_long
*header_size
,
1887 /* vmsize is the padded header page(s) + segment vmsizes */
1889 *header_size
= (object
->is_final_image
) ?
1890 0 : (u_long
)kxld_round_page_cross_safe(get_macho_header_size(object
));
1892 *vmsize
= *header_size
+ get_macho_data_size(object
);
1896 /*******************************************************************************
1897 *******************************************************************************/
1899 kxld_object_set_linked_object_size(KXLDObject
*object
, u_long vmsize
)
1903 if (isOldInterface
) {
1904 object
->output_buffer_size
= vmsize
; /* cache this for use later */
1907 object
->split_info
.linkedKextSize
= vmsize
;
1912 /*******************************************************************************
1913 *******************************************************************************/
1915 kxld_object_export_linked_object(const KXLDObject
*object
,
1919 kern_return_t rval
= KERN_FAILURE
;
1920 KXLDSeg
*seg
= NULL
;
1922 u_long header_size
= 0;
1923 u_long header_offset
= 0;
1924 u_long data_offset
= 0;
1927 boolean_t is_32bit_object
= kxld_object_is_32_bit(object
);
1928 kxld_addr_t link_addr
;
1929 u_char
*my_linked_object
;
1932 check(linked_object
);
1934 if (isOldInterface
) {
1935 size
= object
->output_buffer_size
;
1936 link_addr
= object
->link_addr
;
1937 my_linked_object
= (u_char
*) linked_object
;
1940 size
= ((splitKextLinkInfo
*)linked_object
)->linkedKextSize
;
1941 link_addr
= ((splitKextLinkInfo
*)linked_object
)->vmaddr_TEXT
;
1942 my_linked_object
= ((splitKextLinkInfo
*)linked_object
)->linkedKext
;
1945 /* Calculate the size of the headers and data */
1947 header_size
= get_macho_header_size(object
);
1949 /* Copy data to the file */
1951 ncmds
= object
->segs
.nitems
+ 1 /* LC_SYMTAB */;
1954 /* don't write out a DYSYMTAB segment for targets that can't digest it
1956 if (target_supports_slideable_kexts(object
)) {
1957 ncmds
++; /* dysymtab */
1959 #endif /* KXLD_PIC_KEXTS */
1961 if (object
->uuid
.has_uuid
== TRUE
) {
1965 if (object
->versionmin
.has_versionmin
== TRUE
) {
1969 if (object
->srcversion
.has_srcversion
== TRUE
) {
1973 if (isSplitKext
&& object
->splitinfolc
.has_splitinfolc
) {
1977 rval
= export_macho_header(object
, my_linked_object
, ncmds
, &header_offset
, header_size
);
1978 require_noerr(rval
, finish
);
1980 for (i
= 0; i
< object
->segs
.nitems
; ++i
) {
1981 seg
= kxld_array_get_item(&object
->segs
, i
);
1983 rval
= kxld_seg_export_macho_to_vm(seg
, my_linked_object
, &header_offset
,
1984 header_size
, size
, link_addr
, is_32bit_object
);
1985 require_noerr(rval
, finish
);
1988 seg
= kxld_object_get_seg_by_name(object
, SEG_LINKEDIT
);
1989 data_offset
= (u_long
) (seg
->link_addr
- link_addr
);
1991 // data_offset is used to set the fileoff in the macho header load commands
1992 rval
= kxld_symtab_export_macho(object
->symtab
,
1996 &data_offset
, size
, is_32bit_object
);
1997 require_noerr(rval
, finish
);
1999 // data_offset now points past the symbol tab and strings data in the linkedit
2000 // segment - (it was used to set new values for symoff and stroff)
2003 if (target_supports_slideable_kexts(object
)) {
2004 rval
= kxld_reloc_export_macho(&object
->relocator
,
2010 &data_offset
, size
);
2011 require_noerr(rval
, finish
);
2013 #endif /* KXLD_PIC_KEXTS */
2015 if (object
->uuid
.has_uuid
) {
2016 rval
= kxld_uuid_export_macho(&object
->uuid
, my_linked_object
, &header_offset
, header_size
);
2017 require_noerr(rval
, finish
);
2020 if (object
->versionmin
.has_versionmin
) {
2021 rval
= kxld_versionmin_export_macho(&object
->versionmin
, my_linked_object
, &header_offset
, header_size
);
2022 require_noerr(rval
, finish
);
2025 if (object
->srcversion
.has_srcversion
) {
2026 rval
= kxld_srcversion_export_macho(&object
->srcversion
, my_linked_object
, &header_offset
, header_size
);
2027 require_noerr(rval
, finish
);
2030 if (isSplitKext
&& object
->splitinfolc
.has_splitinfolc
) {
2031 rval
= kxld_splitinfolc_export_macho(&object
->splitinfolc
,
2037 require_noerr(rval
, finish
);
2041 unswap_macho(my_linked_object
, object
->host_order
, object
->target_order
);
2044 rval
= KERN_SUCCESS
;
2050 /*******************************************************************************
2051 *******************************************************************************/
2052 static kern_return_t
2053 export_macho_header(const KXLDObject
*object
, u_char
*buf
, u_int ncmds
,
2054 u_long
*header_offset
, u_long header_size
)
2056 kern_return_t rval
= KERN_FAILURE
;
2060 check(header_offset
);
2062 KXLD_3264_FUNC(kxld_object_is_32_bit(object
), rval
,
2063 export_macho_header_32
, export_macho_header_64
,
2064 object
, buf
, ncmds
, header_offset
, header_size
);
2065 require_noerr(rval
, finish
);
2067 rval
= KERN_SUCCESS
;
2073 #if KXLD_USER_OR_ILP32
2074 /*******************************************************************************
2075 *******************************************************************************/
2076 static kern_return_t
2077 export_macho_header_32(const KXLDObject
*object
, u_char
*buf
, u_int ncmds
,
2078 u_long
*header_offset
, u_long header_size
)
2080 kern_return_t rval
= KERN_FAILURE
;
2081 struct mach_header
*mach
= NULL
;
2085 check(header_offset
);
2087 require_action(sizeof(*mach
) <= header_size
- *header_offset
, finish
,
2089 mach
= (struct mach_header
*) ((void *) (buf
+ *header_offset
));
2091 mach
->magic
= MH_MAGIC
;
2092 mach
->cputype
= object
->cputype
;
2093 mach
->cpusubtype
= object
->cpusubtype
;
2094 mach
->filetype
= object
->filetype
;
2095 mach
->ncmds
= ncmds
;
2096 mach
->sizeofcmds
= (uint32_t) (header_size
- sizeof(*mach
));
2097 mach
->flags
= MH_NOUNDEFS
;
2099 *header_offset
+= sizeof(*mach
);
2101 rval
= KERN_SUCCESS
;
2106 #endif /* KXLD_USER_OR_ILP32 */
2108 #if KXLD_USER_OR_LP64
2109 /*******************************************************************************
2110 *******************************************************************************/
2111 static kern_return_t
2112 export_macho_header_64(const KXLDObject
*object
, u_char
*buf
, u_int ncmds
,
2113 u_long
*header_offset
, u_long header_size
)
2115 kern_return_t rval
= KERN_FAILURE
;
2116 struct mach_header_64
*mach
= NULL
;
2120 check(header_offset
);
2122 require_action(sizeof(*mach
) <= header_size
- *header_offset
, finish
,
2124 mach
= (struct mach_header_64
*) ((void *) (buf
+ *header_offset
));
2126 mach
->magic
= MH_MAGIC_64
;
2127 mach
->cputype
= object
->cputype
;
2128 mach
->cpusubtype
= object
->cpusubtype
;
2129 mach
->filetype
= object
->filetype
;
2130 mach
->ncmds
= ncmds
;
2131 mach
->sizeofcmds
= (uint32_t) (header_size
- sizeof(*mach
));
2132 mach
->flags
= MH_NOUNDEFS
;
2134 *header_offset
+= sizeof(*mach
);
2136 #if SPLIT_KEXTS_DEBUG
2138 kxld_log(kKxldLogLinking
, kKxldLogErr
,
2139 " %p >>> Start of macho header (size %lu) <%s>",
2143 kxld_log(kKxldLogLinking
, kKxldLogErr
,
2144 " %p <<< End of macho header <%s>",
2145 (void *) ((u_char
*)mach
+ sizeof(*mach
)),
2150 rval
= KERN_SUCCESS
;
2155 #endif /* KXLD_USER_OR_LP64 */
2157 /*******************************************************************************
2158 *******************************************************************************/
2160 kxld_object_index_symbols_by_name(KXLDObject
*object
)
2162 return kxld_symtab_index_symbols_by_name(object
->symtab
);
2165 /*******************************************************************************
2166 *******************************************************************************/
2168 kxld_object_index_cxx_symbols_by_value(KXLDObject
*object
)
2170 return kxld_symtab_index_cxx_symbols_by_value(object
->symtab
);
2173 /*******************************************************************************
2174 *******************************************************************************/
2176 kxld_object_relocate(KXLDObject
*object
, kxld_addr_t link_address
)
2178 kern_return_t rval
= KERN_FAILURE
;
2179 KXLDSeg
*seg
= NULL
;
2184 object
->link_addr
= link_address
;
2186 /* Relocate segments (which relocates the sections) */
2187 for (i
= 0; i
< object
->segs
.nitems
; ++i
) {
2188 seg
= kxld_array_get_item(&object
->segs
, i
);
2189 kxld_seg_relocate(seg
, link_address
);
2192 /* Relocate symbols */
2193 rval
= kxld_symtab_relocate(object
->symtab
, &object
->sects
);
2194 require_noerr(rval
, finish
);
2196 rval
= KERN_SUCCESS
;
2201 /*******************************************************************************
2202 *******************************************************************************/
2204 get_mutable_sym(const KXLDObject
*object
, const KXLDSym
*sym
)
2206 KXLDSym
*rval
= NULL
;
2207 kern_return_t result
= KERN_FAILURE
;
2210 result
= kxld_symtab_get_sym_index(object
->symtab
, sym
, &i
);
2211 require_noerr(result
, finish
);
2213 rval
= kxld_symtab_get_symbol_by_index(object
->symtab
, i
);
2214 require_action(rval
== sym
, finish
, rval
=NULL
);
2220 /*******************************************************************************
2221 *******************************************************************************/
2223 kxld_object_resolve_symbol(KXLDObject
*object
,
2224 const KXLDSym
*sym
, kxld_addr_t addr
)
2226 kern_return_t rval
= KERN_FAILURE
;
2227 KXLDSym
*resolved_sym
= NULL
;
2229 resolved_sym
= get_mutable_sym(object
, sym
);
2230 require_action(resolved_sym
, finish
, rval
=KERN_FAILURE
);
2232 rval
= kxld_sym_resolve(resolved_sym
, addr
);
2233 require_noerr(rval
, finish
);
2235 rval
= KERN_SUCCESS
;
2240 /*******************************************************************************
2241 *******************************************************************************/
2243 kxld_object_patch_symbol(KXLDObject
*object
, const struct kxld_sym
*sym
)
2245 kern_return_t rval
= KERN_FAILURE
;
2246 KXLDSym
*patched_sym
= NULL
;
2248 patched_sym
= get_mutable_sym(object
, sym
);
2249 require_action(patched_sym
, finish
, rval
=KERN_FAILURE
);
2251 (void) kxld_sym_patch(patched_sym
);
2252 rval
= KERN_SUCCESS
;
2257 /*******************************************************************************
2258 *******************************************************************************/
2260 kxld_object_add_symbol(KXLDObject
*object
, char *name
, kxld_addr_t link_addr
,
2261 const KXLDSym
**sym_out
)
2263 kern_return_t rval
= KERN_FAILURE
;
2264 KXLDSym
*sym
= NULL
;
2266 rval
= kxld_symtab_add_symbol(object
->symtab
, name
, link_addr
, &sym
);
2267 require_noerr(rval
, finish
);
2270 rval
= KERN_SUCCESS
;
2275 /*******************************************************************************
2276 *******************************************************************************/
2278 kxld_object_process_relocations(KXLDObject
*object
,
2279 const KXLDDict
*patched_vtables
)
2281 kern_return_t rval
= KERN_FAILURE
;
2283 (void) kxld_relocator_set_vtables(&object
->relocator
, patched_vtables
);
2285 /* Process relocation entries and populate the global offset table.
2287 * For final linked images: the relocation entries are contained in a couple
2288 * of tables hanging off the end of the symbol table. The GOT has its own
2289 * section created by the linker; we simply need to fill it.
2291 * For object files: the relocation entries are bound to each section.
2292 * The GOT, if it exists for the target architecture, is created by kxld,
2293 * and we must populate it according to our internal structures.
2295 if (object
->is_final_image
) {
2296 #if KXLD_USER_OR_BUNDLE
2297 rval
= process_symbol_pointers(object
);
2298 require_noerr(rval
, finish
);
2300 rval
= process_relocs_from_tables(object
);
2301 require_noerr(rval
, finish
);
2303 require_action(FALSE
, finish
, rval
=KERN_FAILURE
);
2304 #endif /* KXLD_USER_OR_BUNDLE */
2306 #if KXLD_USER_OR_GOT
2308 rval
= populate_got(object
);
2309 require_noerr(rval
, finish
);
2310 #endif /* KXLD_USER_OR_GOT */
2311 #if KXLD_USER_OR_OBJECT
2312 rval
= process_relocs_from_sections(object
);
2313 require_noerr(rval
, finish
);
2315 require_action(FALSE
, finish
, rval
=KERN_FAILURE
);
2316 #endif /* KXLD_USER_OR_OBJECT */
2319 /* Populate kmod info structure */
2320 rval
= populate_kmod_info(object
);
2321 require_noerr(rval
, finish
);
2323 rval
= KERN_SUCCESS
;
2328 #if KXLD_USER_OR_BUNDLE
2330 #if SPLIT_KEXTS_DEBUG
2331 static boolean_t kxld_show_ptr_value
;
2334 #define SECT_SYM_PTRS "__nl_symbol_ptr"
2336 /*******************************************************************************
2337 * Final linked images create an __nl_symbol_ptr section for the global offset
2338 * table and for symbol pointer lookups in general. Rather than use relocation
2339 * entries, the linker creates an "indirect symbol table" which stores indexes
2340 * into the symbol table corresponding to the entries of this section. This
2341 * function populates the section with the relocated addresses of those symbols.
2342 *******************************************************************************/
2343 static kern_return_t
2344 process_symbol_pointers(KXLDObject
*object
)
2346 kern_return_t rval
= KERN_FAILURE
;
2347 KXLDSect
*sect
= NULL
;
2348 KXLDSym
*sym
= NULL
;
2349 int32_t *symidx
= NULL
;
2350 u_char
*symptr
= NULL
;
2351 u_long symptrsize
= 0;
2358 require_action(object
->is_final_image
&& object
->dysymtab_hdr
,
2359 finish
, rval
=KERN_FAILURE
);
2361 /* Get the __DATA,__nl_symbol_ptr section. If it doesn't exist, we have
2365 sect
= kxld_object_get_sect_by_name(object
, SEG_DATA
, SECT_SYM_PTRS
);
2366 if (!sect
|| !(sect
->flags
& S_NON_LAZY_SYMBOL_POINTERS
)) {
2367 rval
= KERN_SUCCESS
;
2371 /* Calculate the table offset and number of entries in the section */
2373 if (kxld_object_is_32_bit(object
)) {
2374 symptrsize
= sizeof(uint32_t);
2376 symptrsize
= sizeof(uint64_t);
2379 nsyms
= (u_int
) (sect
->size
/ symptrsize
);
2380 firstsym
= sect
->reserved1
;
2382 require_action(firstsym
+ nsyms
<= object
->dysymtab_hdr
->nindirectsyms
,
2383 finish
, rval
=KERN_FAILURE
;
2384 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
2385 "firstsym + nsyms > object->dysymtab_hdr->nindirectsyms"));
2387 /* Iterate through the indirect symbol table and fill in the section of
2388 * symbol pointers. There are three cases:
2389 * 1) A normal symbol - put its value directly in the table
2390 * 2) An INDIRECT_SYMBOL_LOCAL - symbols that are local and already have
2391 * their offset from the start of the file in the section. Simply
2392 * add the file's link address to fill this entry.
2393 * 3) An INDIRECT_SYMBOL_ABS - prepopulated absolute symbols. No
2394 * action is required.
2397 if (isOldInterface
) {
2398 symidx
= (int32_t *) ((void *) (object
->file
+ object
->dysymtab_hdr
->indirectsymoff
));
2401 symidx
= (int32_t *) ((void *) (object
->split_info
.kextExecutable
+ object
->dysymtab_hdr
->indirectsymoff
));
2405 symptr
= sect
->data
;
2406 for (i
= 0; i
< nsyms
; ++i
, ++symidx
, symptr
+=symptrsize
) {
2407 if (*symidx
& INDIRECT_SYMBOL_LOCAL
) {
2408 if (*symidx
& INDIRECT_SYMBOL_ABS
) continue;
2410 if (isOldInterface
) {
2411 add_to_ptr(symptr
, object
->link_addr
, kxld_object_is_32_bit(object
));
2414 add_to_ptr(symptr
, object
->split_info
.vmaddr_TEXT
, kxld_object_is_32_bit(object
));
2417 sym
= kxld_symtab_get_symbol_by_index(object
->symtab
, *symidx
);
2418 require_action(sym
, finish
, rval
=KERN_FAILURE
);
2420 if (isOldInterface
) {
2421 add_to_ptr(symptr
, sym
->link_addr
, kxld_object_is_32_bit(object
));
2424 add_to_ptr(symptr
, object
->split_info
.vmaddr_TEXT
, kxld_object_is_32_bit(object
));
2429 rval
= KERN_SUCCESS
;
2434 /*******************************************************************************
2435 *******************************************************************************/
2437 get_seg_by_base_addr(KXLDObject
*object
, kxld_addr_t base_addr
)
2439 KXLDSeg
*seg
= NULL
;
2440 kxld_addr_t start
= 0;
2441 kxld_addr_t end
= 0;
2444 for (i
= 0; i
< object
->segs
.nitems
; ++i
) {
2445 seg
= kxld_array_get_item(&object
->segs
, i
);
2446 start
= seg
->base_addr
;
2447 end
= seg
->base_addr
+ seg
->vmsize
;
2449 if (start
<= base_addr
&& base_addr
< end
) return seg
;
2455 /*******************************************************************************
2456 *******************************************************************************/
2457 static kern_return_t
2458 process_relocs_from_tables(KXLDObject
*object
)
2460 kern_return_t rval
= KERN_FAILURE
;
2461 KXLDReloc
*reloc
= NULL
;
2462 KXLDSeg
*seg
= NULL
;
2465 /* Process external relocations */
2466 for (i
= 0; i
< object
->extrelocs
.nitems
; ++i
) {
2467 reloc
= kxld_array_get_item(&object
->extrelocs
, i
);
2469 seg
= get_seg_by_base_addr(object
, reloc
->address
);
2470 require_action(seg
, finish
, rval
=KERN_FAILURE
);
2472 if (isOldInterface
) {
2473 rval
= kxld_relocator_process_table_reloc(&object
->relocator
, reloc
,
2474 seg
, object
->link_addr
);
2477 kxld_addr_t my_link_addr
= object
->split_info
.vmaddr_TEXT
;
2479 if (kxld_seg_is_text_exec_seg(seg
)) {
2480 my_link_addr
= object
->split_info
.vmaddr_TEXT_EXEC
;
2482 else if (kxld_seg_is_data_seg(seg
)) {
2483 my_link_addr
= object
->split_info
.vmaddr_DATA
;
2485 else if (kxld_seg_is_data_const_seg(seg
)) {
2486 my_link_addr
= object
->split_info
.vmaddr_DATA_CONST
;
2488 else if (kxld_seg_is_llvm_cov_seg(seg
)) {
2489 my_link_addr
= object
->split_info
.vmaddr_LLVM_COV
;
2491 else if (kxld_seg_is_linkedit_seg(seg
)) {
2492 my_link_addr
= object
->split_info
.vmaddr_LINKEDIT
;
2495 rval
= kxld_relocator_process_table_reloc(&object
->relocator
,
2500 require_noerr(rval
, finish
);
2503 /* Process local relocations */
2504 for (i
= 0; i
< object
->locrelocs
.nitems
; ++i
) {
2505 reloc
= kxld_array_get_item(&object
->locrelocs
, i
);
2507 seg
= get_seg_by_base_addr(object
, reloc
->address
);
2508 require_action(seg
, finish
, rval
=KERN_FAILURE
);
2510 if (isOldInterface
) {
2511 rval
= kxld_relocator_process_table_reloc(&object
->relocator
, reloc
,
2512 seg
, object
->link_addr
);
2515 kxld_addr_t my_link_addr
= object
->split_info
.vmaddr_TEXT
;
2517 if (kxld_seg_is_text_exec_seg(seg
)) {
2518 my_link_addr
= object
->split_info
.vmaddr_TEXT_EXEC
;
2520 else if (kxld_seg_is_data_seg(seg
)) {
2521 my_link_addr
= object
->split_info
.vmaddr_DATA
;
2523 else if (kxld_seg_is_data_const_seg(seg
)) {
2524 my_link_addr
= object
->split_info
.vmaddr_DATA_CONST
;
2526 else if (kxld_seg_is_llvm_cov_seg(seg
)) {
2527 my_link_addr
= object
->split_info
.vmaddr_LLVM_COV
;
2529 else if (kxld_seg_is_linkedit_seg(seg
)) {
2530 my_link_addr
= object
->split_info
.vmaddr_LINKEDIT
;
2533 rval
= kxld_relocator_process_table_reloc(&object
->relocator
,
2538 require_noerr(rval
, finish
);
2541 rval
= KERN_SUCCESS
;
2546 /*******************************************************************************
2547 *******************************************************************************/
2549 add_to_ptr(u_char
*symptr
, kxld_addr_t val
, boolean_t is_32_bit
)
2552 uint32_t *ptr
= (uint32_t *) ((void *) symptr
);
2554 *ptr
+= (uint32_t) val
;
2556 uint64_t *ptr
= (uint64_t *) ((void *) symptr
);
2558 *ptr
+= (uint64_t) val
;
2561 #if SPLIT_KEXTS_DEBUG
2562 kxld_show_ptr_value
= FALSE
;
2566 #endif /* KXLD_USER_OR_BUNDLE */
2568 #if KXLD_USER_OR_OBJECT
2569 /*******************************************************************************
2570 *******************************************************************************/
2571 static kern_return_t
2572 process_relocs_from_sections(KXLDObject
*object
)
2574 kern_return_t rval
= KERN_FAILURE
;
2575 KXLDSect
*sect
= NULL
;
2578 for (i
= 0; i
< object
->sects
.nitems
; ++i
) {
2579 sect
= kxld_array_get_item(&object
->sects
, i
);
2580 rval
= kxld_sect_process_relocs(sect
, &object
->relocator
);
2581 require_noerr(rval
, finish
);
2584 rval
= KERN_SUCCESS
;
2588 #endif /* KXLD_USER_OR_OBJECT */
2590 /*******************************************************************************
2591 *******************************************************************************/
2592 static kern_return_t
2593 populate_kmod_info(KXLDObject
*object
)
2595 kern_return_t rval
= KERN_FAILURE
;
2596 KXLDSect
*kmodsect
= NULL
;
2597 KXLDSym
*kmodsym
= NULL
;
2598 kmod_info_t
*kmod_info
= NULL
;
2599 u_long kmod_offset
= 0;
2603 if (kxld_object_is_kernel(object
)) {
2604 rval
= KERN_SUCCESS
;
2608 kxld_object_get_vmsize(object
, &header_size
, &size
);
2610 kmodsym
= kxld_symtab_get_locally_defined_symbol_by_name(object
->symtab
,
2611 KXLD_KMOD_INFO_SYMBOL
);
2612 require_action(kmodsym
, finish
, rval
=KERN_FAILURE
;
2613 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogNoKmodInfo
));
2615 kmodsect
= kxld_array_get_item(&object
->sects
, kmodsym
->sectnum
);
2617 kmod_offset
= (u_long
) (kmodsym
->base_addr
- kmodsect
->base_addr
);
2618 kmod_info
= (kmod_info_t
*) ((void *) (kmodsect
->data
+ kmod_offset
));
2620 if (kxld_object_is_32_bit(object
)) {
2621 kmod_info_32_v1_t
*kmod
= (kmod_info_32_v1_t
*) (kmod_info
);
2623 if (isOldInterface
) {
2624 kmod
->address
= (uint32_t) object
->link_addr
;
2627 kmod
->address
= (uint32_t) object
->split_info
.vmaddr_TEXT
;
2630 kmod
->size
= (uint32_t) size
;
2631 kmod
->hdr_size
= (uint32_t) header_size
;
2634 if (kxld_object_target_needs_swap(object
)) {
2635 kmod
->address
= OSSwapInt32(kmod
->address
);
2636 kmod
->size
= OSSwapInt32(kmod
->size
);
2637 kmod
->hdr_size
= OSSwapInt32(kmod
->hdr_size
);
2639 #endif /* !KERNEL */
2641 kmod_info_64_v1_t
*kmod
= (kmod_info_64_v1_t
*) (kmod_info
);
2643 if (isOldInterface
) {
2644 kmod
->address
= object
->link_addr
;
2647 kmod
->address
= object
->split_info
.vmaddr_TEXT
;
2651 kmod
->hdr_size
= header_size
;
2654 if (kxld_object_target_needs_swap(object
)) {
2655 kmod
->address
= OSSwapInt64(kmod
->address
);
2656 kmod
->size
= OSSwapInt64(kmod
->size
);
2657 kmod
->hdr_size
= OSSwapInt64(kmod
->hdr_size
);
2659 #endif /* !KERNEL */
2661 #if SPLIT_KEXTS_DEBUG
2663 kxld_log(kKxldLogLinking
, kKxldLogErr
,
2664 " kmodsect %p kmod_info %p = kmodsect->data %p + kmod_offset %lu <%s>",
2667 (void *) kmodsect
->data
,
2671 kxld_log(kKxldLogLinking
, kKxldLogErr
,
2672 " kmod_info data: address %p size %llu hdr_size %llu start_addr %p stop_addr %p <%s>",
2673 (void *) kmod
->address
,
2676 (void *) kmod
->start_addr
,
2677 (void *) kmod
->stop_addr
,
2684 rval
= KERN_SUCCESS
;
2691 /*******************************************************************************
2692 *******************************************************************************/
2694 target_supports_slideable_kexts(const KXLDObject
*object
)
2698 return (object
->cputype
!= CPU_TYPE_I386
&& object
->include_kaslr_relocs
);
2700 #endif /* KXLD_PIC_KEXTS */