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_LINKEDIT
= link_info
->vmaddr_LINKEDIT
;
361 /*******************************************************************************
362 *******************************************************************************/
364 get_target_machine_info(KXLDObject
*object
, cpu_type_t cputype __unused
,
365 cpu_subtype_t cpusubtype __unused
)
369 /* Because the kernel can only link for its own architecture, we know what
370 * the host and target architectures are at compile time, so we can use
371 * a vastly simplified version of this function.
376 #if defined(__x86_64__)
377 object
->cputype
= CPU_TYPE_X86_64
;
378 /* FIXME: we need clang to provide a __x86_64h__ macro for the sub-type. Using
379 * __AVX2__ is a temporary solution until this is available. */
380 #if defined(__AVX2__)
381 object
->cpusubtype
= CPU_SUBTYPE_X86_64_H
;
383 object
->cpusubtype
= CPU_SUBTYPE_X86_64_ALL
;
387 kxld_log(kKxldLogLinking
, kKxldLogErr
,
388 kKxldLogArchNotSupported
, _mh_execute_header
->cputype
);
389 return KERN_NOT_SUPPORTED
;
390 #endif /* Supported architecture defines */
395 /* User-space must look up the architecture it's running on and the target
396 * architecture at run-time.
399 kern_return_t rval
= KERN_FAILURE
;
400 const NXArchInfo
*host_arch
= NULL
;
404 host_arch
= NXGetLocalArchInfo();
405 require_action(host_arch
, finish
, rval
=KERN_FAILURE
);
407 object
->host_order
= host_arch
->byteorder
;
409 /* If the user did not specify a cputype, use the local architecture.
413 object
->cputype
= cputype
;
414 object
->cpusubtype
= cpusubtype
;
416 object
->cputype
= host_arch
->cputype
;
417 object
->target_order
= object
->host_order
;
419 switch (object
->cputype
) {
421 object
->cpusubtype
= CPU_SUBTYPE_I386_ALL
;
423 case CPU_TYPE_X86_64
:
424 object
->cpusubtype
= CPU_SUBTYPE_X86_64_ALL
;
427 object
->cpusubtype
= CPU_SUBTYPE_ARM_ALL
;
430 object
->cpusubtype
= CPU_SUBTYPE_ARM64_ALL
;
433 object
->cpusubtype
= 0;
438 /* Validate that we support the target architecture and record its
442 switch(object
->cputype
) {
446 case CPU_TYPE_X86_64
:
447 object
->target_order
= NX_LittleEndian
;
450 rval
= KERN_NOT_SUPPORTED
;
451 kxld_log(kKxldLogLinking
, kKxldLogErr
,
452 kKxldLogArchNotSupported
, object
->cputype
);
463 /*******************************************************************************
464 *******************************************************************************/
466 get_macho_slice_for_arch(KXLDObject
*object
, u_char
*file
, u_long size
)
468 kern_return_t rval
= KERN_FAILURE
;
469 struct mach_header
*mach_hdr
= NULL
;
471 struct fat_header
*fat
= (struct fat_header
*) ((void *) file
);
472 struct fat_arch
*archs
= (struct fat_arch
*) &fat
[1];
473 boolean_t swap
= FALSE
;
475 u_char
*my_file
= file
;
476 u_long my_file_size
= size
;
482 /* We are assuming that we will never receive a fat file in the kernel */
485 require_action(size
>= sizeof(*fat
), finish
,
487 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogTruncatedMachO
));
489 /* The fat header is always big endian, so swap if necessary */
490 if (fat
->magic
== FAT_CIGAM
) {
491 (void) swap_fat_header(fat
, object
->host_order
);
495 if (fat
->magic
== FAT_MAGIC
) {
496 struct fat_arch
*arch
= NULL
;
498 require_action(size
>= (sizeof(*fat
) + (fat
->nfat_arch
* sizeof(*archs
))),
501 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogTruncatedMachO
));
503 /* Swap the fat_arch structures if necessary */
505 (void) swap_fat_arch(archs
, fat
->nfat_arch
, object
->host_order
);
508 /* Locate the Mach-O for the requested architecture */
510 arch
= NXFindBestFatArch(object
->cputype
, object
->cpusubtype
, archs
, fat
->nfat_arch
);
511 require_action(arch
, finish
, rval
=KERN_FAILURE
;
512 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogArchNotFound
));
513 require_action(size
>= arch
->offset
+ arch
->size
, finish
,
515 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogTruncatedMachO
));
517 my_file
= my_file
+ arch
->offset
;
518 my_file_size
= arch
->size
;
522 /* Swap the Mach-O's headers to this architecture if necessary */
523 if (kxld_object_is_32_bit(object
)) {
524 rval
= validate_and_swap_macho_32(my_file
, my_file_size
530 rval
= validate_and_swap_macho_64(my_file
, my_file_size
536 require_noerr(rval
, finish
);
538 mach_hdr
= (struct mach_header
*) ((void *) my_file
);
539 require_action(object
->cputype
== mach_hdr
->cputype
, finish
,
541 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogTruncatedMachO
));
542 object
->cpusubtype
= mach_hdr
->cpusubtype
; /* <rdar://problem/16008438> */
544 if (isOldInterface
) {
545 object
->file
= my_file
;
546 object
->size
= my_file_size
;
549 object
->split_info
.kextExecutable
= my_file
;
550 object
->split_info
.kextSize
= my_file_size
;
558 /*******************************************************************************
559 *******************************************************************************/
561 init_from_final_linked_image(KXLDObject
*object
, u_int
*filetype_out
,
562 struct symtab_command
**symtab_hdr_out
)
564 kern_return_t rval
= KERN_FAILURE
;
566 KXLDSect
*sect
= NULL
;
567 struct load_command
*cmd_hdr
= NULL
;
568 struct symtab_command
*symtab_hdr
= NULL
;
569 struct uuid_command
*uuid_hdr
= NULL
;
570 struct version_min_command
*versionmin_hdr
= NULL
;
571 struct source_version_command
*source_version_hdr
= NULL
;
572 u_long base_offset
= 0;
574 u_long sect_offset
= 0;
585 if (isOldInterface
) {
586 my_file
= object
->file
;
589 my_file
= object
->split_info
.kextExecutable
;
592 KXLD_3264_FUNC(kxld_object_is_32_bit(object
), base_offset
,
593 get_macho_cmd_data_32
, get_macho_cmd_data_64
,
594 my_file
, offset
, &filetype
, &ncmds
);
596 /* First pass to count segments and sections */
598 offset
= base_offset
;
599 for (i
= 0; i
< ncmds
; ++i
, offset
+= cmd_hdr
->cmdsize
) {
600 cmd_hdr
= (struct load_command
*) ((void *) (my_file
+ offset
));
602 switch(cmd_hdr
->cmd
) {
603 #if KXLD_USER_OR_ILP32
606 struct segment_command
*seg_hdr
=
607 (struct segment_command
*) cmd_hdr
;
609 /* Ignore segments with no vm size */
610 if (!seg_hdr
->vmsize
) continue;
613 nsects
+= seg_hdr
->nsects
;
616 #endif /* KXLD_USER_OR_ILP32 */
617 #if KXLD_USER_OR_LP64
620 struct segment_command_64
*seg_hdr
=
621 (struct segment_command_64
*) ((void *) cmd_hdr
);
623 /* Ignore segments with no vm size */
624 if (!seg_hdr
->vmsize
) continue;
627 nsects
+= seg_hdr
->nsects
;
630 #endif /* KXLD_USER_OR_LP64 */
636 /* Allocate the segments and sections */
639 rval
= kxld_array_init(&object
->segs
, sizeof(KXLDSeg
), nsegs
);
640 require_noerr(rval
, finish
);
642 rval
= kxld_array_init(&object
->sects
, sizeof(KXLDSect
), nsects
);
643 require_noerr(rval
, finish
);
646 /* Initialize the segments and sections */
648 offset
= base_offset
;
649 for (i
= 0; i
< ncmds
; ++i
, offset
+= cmd_hdr
->cmdsize
) {
650 cmd_hdr
= (struct load_command
*) ((void *) (my_file
+ offset
));
653 switch(cmd_hdr
->cmd
) {
654 #if KXLD_USER_OR_ILP32
657 struct segment_command
*seg_hdr
=
658 (struct segment_command
*) cmd_hdr
;
660 /* Ignore segments with no vm size */
661 if (!seg_hdr
->vmsize
) continue;
663 seg
= kxld_array_get_item(&object
->segs
, segi
++);
665 rval
= kxld_seg_init_from_macho_32(seg
, seg_hdr
);
666 require_noerr(rval
, finish
);
668 sect_offset
= offset
+ sizeof(*seg_hdr
);
671 #endif /* KXLD_USER_OR_ILP32 */
672 #if KXLD_USER_OR_LP64
675 struct segment_command_64
*seg_hdr
=
676 (struct segment_command_64
*) ((void *) cmd_hdr
);
678 /* Ignore segments with no vm size */
679 if (!seg_hdr
->vmsize
) continue;
681 seg
= kxld_array_get_item(&object
->segs
, segi
++);
683 rval
= kxld_seg_init_from_macho_64(seg
, seg_hdr
);
684 require_noerr(rval
, finish
);
686 sect_offset
= offset
+ sizeof(*seg_hdr
);
689 #endif /* KXLD_USER_OR_LP64 */
691 symtab_hdr
= (struct symtab_command
*) cmd_hdr
;
694 uuid_hdr
= (struct uuid_command
*) cmd_hdr
;
695 kxld_uuid_init_from_macho(&object
->uuid
, uuid_hdr
);
697 case LC_VERSION_MIN_MACOSX
:
698 case LC_VERSION_MIN_IPHONEOS
:
699 case LC_VERSION_MIN_TVOS
:
700 case LC_VERSION_MIN_WATCHOS
:
701 versionmin_hdr
= (struct version_min_command
*) cmd_hdr
;
702 kxld_versionmin_init_from_macho(&object
->versionmin
, versionmin_hdr
);
704 case LC_SOURCE_VERSION
:
705 source_version_hdr
= (struct source_version_command
*) (void *) cmd_hdr
;
706 kxld_srcversion_init_from_macho(&object
->srcversion
, source_version_hdr
);
709 object
->dysymtab_hdr
= (struct dysymtab_command
*) cmd_hdr
;
710 rval
= kxld_reloc_create_macho(&object
->extrelocs
, &object
->relocator
,
711 (struct relocation_info
*) ((void *) (my_file
+ object
->dysymtab_hdr
->extreloff
)),
712 object
->dysymtab_hdr
->nextrel
);
713 require_noerr(rval
, finish
);
715 rval
= kxld_reloc_create_macho(&object
->locrelocs
, &object
->relocator
,
716 (struct relocation_info
*) ((void *) (my_file
+ object
->dysymtab_hdr
->locreloff
)),
717 object
->dysymtab_hdr
->nlocrel
);
718 require_noerr(rval
, finish
);
723 /* Don't need to do anything with UNIXTHREAD or MAIN for the kernel */
724 require_action(kxld_object_is_kernel(object
),
725 finish
, rval
=KERN_FAILURE
;
726 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
727 "LC_UNIXTHREAD/LC_MAIN segment is not valid in a kext."));
729 case LC_SEGMENT_SPLIT_INFO
:
731 struct linkedit_data_command
*split_info_hdr
= NULL
;
732 split_info_hdr
= (struct linkedit_data_command
*) (void *) cmd_hdr
;
733 kxld_splitinfolc_init_from_macho(&object
->splitinfolc
, split_info_hdr
);
736 case LC_CODE_SIGNATURE
:
738 case LC_DYLD_INFO_ONLY
:
739 case LC_FUNCTION_STARTS
:
740 case LC_DATA_IN_CODE
:
741 case LC_DYLIB_CODE_SIGN_DRS
:
742 /* Various metadata that might be stored in the linkedit segment */
746 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
747 "Invalid load command type in MH_KEXT_BUNDLE kext: %u.", cmd_hdr
->cmd
);
753 /* Initialize the sections */
754 for (j
= 0; j
< seg
->sects
.nitems
; ++j
, ++secti
) {
755 sect
= kxld_array_get_item(&object
->sects
, secti
);
757 KXLD_3264_FUNC(kxld_object_is_32_bit(object
), rval
,
758 kxld_sect_init_from_macho_32
, kxld_sect_init_from_macho_64
,
759 sect
, my_file
, §_offset
, secti
, &object
->relocator
);
760 require_noerr(rval
, finish
);
762 /* Add the section to the segment. This will also make sure
763 * that the sections and segments have the same segname.
765 rval
= kxld_seg_add_section(seg
, sect
);
766 require_noerr(rval
, finish
);
768 rval
= kxld_seg_finish_init(seg
);
769 require_noerr(rval
, finish
);
773 if (filetype_out
) *filetype_out
= filetype
;
774 if (symtab_hdr_out
) *symtab_hdr_out
= symtab_hdr
;
775 object
->is_final_image
= TRUE
;
781 /*******************************************************************************
782 *******************************************************************************/
784 init_from_execute(KXLDObject
*object
)
786 kern_return_t rval
= KERN_FAILURE
;
787 struct symtab_command
*symtab_hdr
= NULL
;
789 KXLDSeg
* kernel_linkedit_seg
= NULL
; // used if running kernel
790 #if KXLD_USER_OR_OBJECT
792 KXLDSect
*sect
= NULL
;
793 KXLDSectionName
*sname
= NULL
;
794 u_int i
= 0, j
= 0, k
= 0;
795 #endif /* KXLD_USER_OR_OBJECT */
800 if (isOldInterface
) {
801 my_file
= object
->file
;
804 my_file
= object
->split_info
.kextExecutable
;
807 require_action(kxld_object_is_kernel(object
), finish
, rval
=KERN_FAILURE
);
809 rval
= init_from_final_linked_image(object
, &filetype
, &symtab_hdr
);
810 require_noerr(rval
, finish
);
812 require_action(filetype
== MH_EXECUTE
, finish
, rval
=KERN_FAILURE
;
813 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
814 "The kernel file is not of type MH_EXECUTE."));
816 /* Initialize the symbol table. If this is the running kernel
817 * we will work from the in-memory linkedit segment;
818 * otherwise we work from the whole mach-o image.
821 kernel_linkedit_seg
= kxld_object_get_seg_by_name(object
, SEG_LINKEDIT
);
822 require_action(kernel_linkedit_seg
, finish
, rval
=KERN_FAILURE
;
823 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
));
826 KXLD_3264_FUNC(kxld_object_is_32_bit(object
), rval
,
827 kxld_symtab_init_from_macho_32
, kxld_symtab_init_from_macho_64
,
828 object
->symtab
, symtab_hdr
, my_file
, kernel_linkedit_seg
);
829 require_noerr(rval
, finish
);
831 #if KXLD_USER_OR_OBJECT
832 /* Save off the order of section names so that we can lay out kext
833 * sections for MH_OBJECT-based systems.
835 if (target_supports_object(object
)) {
837 rval
= kxld_array_init(object
->section_order
, sizeof(KXLDSectionName
),
838 object
->sects
.nitems
);
839 require_noerr(rval
, finish
);
841 /* Copy the section names into the section_order array for future kext
844 for (i
= 0, k
= 0; i
< object
->segs
.nitems
; ++i
) {
845 seg
= kxld_array_get_item(&object
->segs
, i
);
847 for (j
= 0; j
< seg
->sects
.nitems
; ++j
, ++k
) {
848 sect
= *(KXLDSect
**) kxld_array_get_item(&seg
->sects
, j
);
849 sname
= kxld_array_get_item(object
->section_order
, k
);
851 strlcpy(sname
->segname
, sect
->segname
, sizeof(sname
->segname
));
852 strlcpy(sname
->sectname
, sect
->sectname
, sizeof(sname
->sectname
));
856 #endif /* KXLD_USER_OR_OBJECT */
863 #if KXLD_USER_OR_BUNDLE
864 /*******************************************************************************
865 *******************************************************************************/
867 target_supports_bundle(const KXLDObject
*object __unused
)
872 /*******************************************************************************
873 *******************************************************************************/
875 init_from_bundle(KXLDObject
*object
)
877 kern_return_t rval
= KERN_FAILURE
;
878 struct symtab_command
*symtab_hdr
= NULL
;
884 if (isOldInterface
) {
885 my_file
= object
->file
;
888 my_file
= object
->split_info
.kextExecutable
;
891 require_action(target_supports_bundle(object
), finish
,
893 kxld_log(kKxldLogLinking
, kKxldLogErr
,
894 kKxldLogFiletypeNotSupported
, MH_KEXT_BUNDLE
));
896 rval
= init_from_final_linked_image(object
, &filetype
, &symtab_hdr
);
897 require_noerr(rval
, finish
);
899 require_action(filetype
== MH_KEXT_BUNDLE
, finish
,
902 KXLD_3264_FUNC(kxld_object_is_32_bit(object
), rval
,
903 kxld_symtab_init_from_macho_32
, kxld_symtab_init_from_macho_64
,
904 object
->symtab
, symtab_hdr
, my_file
,
905 /* kernel_linkedit_seg */ NULL
);
906 require_noerr(rval
, finish
);
912 #endif /* KXLD_USER_OR_BUNDLE */
914 #if KXLD_USER_OR_OBJECT
915 /*******************************************************************************
916 *******************************************************************************/
917 static boolean_t
target_supports_object(const KXLDObject
*object
)
919 return (object
->cputype
== CPU_TYPE_I386
);
922 /*******************************************************************************
923 *******************************************************************************/
925 init_from_object(KXLDObject
*object
)
927 kern_return_t rval
= KERN_FAILURE
;
928 struct load_command
*cmd_hdr
= NULL
;
929 struct symtab_command
*symtab_hdr
= NULL
;
930 struct uuid_command
*uuid_hdr
= NULL
;
931 KXLDSect
*sect
= NULL
;
933 u_long sect_offset
= 0;
938 boolean_t has_segment
= FALSE
;
943 if (isOldInterface
) {
944 my_file
= object
->file
;
947 my_file
= object
->split_info
.kextExecutable
;
950 require_action(target_supports_object(object
),
951 finish
, rval
=KERN_FAILURE
;
952 kxld_log(kKxldLogLinking
, kKxldLogErr
,
953 kKxldLogFiletypeNotSupported
, MH_OBJECT
));
955 KXLD_3264_FUNC(kxld_object_is_32_bit(object
), offset
,
956 get_macho_cmd_data_32
, get_macho_cmd_data_64
,
957 my_file
, offset
, &filetype
, &ncmds
);
959 require_action(filetype
== MH_OBJECT
, finish
, rval
=KERN_FAILURE
);
961 /* MH_OBJECTs use one unnamed segment to contain all of the sections. We
962 * loop over all of the load commands to initialize the structures we
963 * expect. Then, we'll use the unnamed segment to get to all of the
964 * sections, and then use those sections to create the actual segments.
967 for (; i
< ncmds
; ++i
, offset
+= cmd_hdr
->cmdsize
) {
968 cmd_hdr
= (struct load_command
*) ((void *) (my_file
+ offset
));
970 switch(cmd_hdr
->cmd
) {
971 #if KXLD_USER_OR_ILP32
974 struct segment_command
*seg_hdr
=
975 (struct segment_command
*) cmd_hdr
;
977 /* Ignore segments with no vm size */
978 if (!seg_hdr
->vmsize
) continue;
980 /* Ignore LINKEDIT segments */
981 if (streq_safe(seg_hdr
->segname
, SEG_LINKEDIT
,
982 const_strlen(SEG_LINKEDIT
)))
987 require_action(kxld_object_is_32_bit(object
), finish
, rval
=KERN_FAILURE
;
988 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
989 "LC_SEGMENT in 64-bit kext."));
990 require_action(!has_segment
, finish
, rval
=KERN_FAILURE
;
991 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
992 "Multiple segments in an MH_OBJECT kext."));
994 nsects
= seg_hdr
->nsects
;
995 sect_offset
= offset
+ sizeof(*seg_hdr
);
999 #endif /* KXLD_USER_OR_ILP32 */
1000 #if KXLD_USER_OR_LP64
1003 struct segment_command_64
*seg_hdr
=
1004 (struct segment_command_64
*) ((void *) cmd_hdr
);
1006 /* Ignore segments with no vm size */
1007 if (!seg_hdr
->vmsize
) continue;
1009 /* Ignore LINKEDIT segments */
1010 if (streq_safe(seg_hdr
->segname
, SEG_LINKEDIT
,
1011 const_strlen(SEG_LINKEDIT
)))
1016 require_action(!kxld_object_is_32_bit(object
), finish
, rval
=KERN_FAILURE
;
1017 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
1018 "LC_SEGMENT_64 in a 32-bit kext."));
1019 require_action(!has_segment
, finish
, rval
=KERN_FAILURE
;
1020 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
1021 "Multiple segments in an MH_OBJECT kext."));
1023 nsects
= seg_hdr
->nsects
;
1024 sect_offset
= offset
+ sizeof(*seg_hdr
);
1028 #endif /* KXLD_USER_OR_LP64 */
1030 symtab_hdr
= (struct symtab_command
*) cmd_hdr
;
1032 KXLD_3264_FUNC(kxld_object_is_32_bit(object
), rval
,
1033 kxld_symtab_init_from_macho_32
, kxld_symtab_init_from_macho_64
,
1034 object
->symtab
, symtab_hdr
, my_file
,
1035 /* kernel_linkedit_seg */ NULL
);
1036 require_noerr(rval
, finish
);
1039 uuid_hdr
= (struct uuid_command
*) cmd_hdr
;
1040 kxld_uuid_init_from_macho(&object
->uuid
, uuid_hdr
);
1044 /* Don't need to do anything with UNIXTHREAD or MAIN */
1046 case LC_CODE_SIGNATURE
:
1048 case LC_DYLD_INFO_ONLY
:
1049 case LC_FUNCTION_STARTS
:
1050 case LC_DATA_IN_CODE
:
1051 case LC_DYLIB_CODE_SIGN_DRS
:
1052 /* Various metadata that might be stored in the linkedit segment */
1054 case LC_VERSION_MIN_MACOSX
:
1055 case LC_VERSION_MIN_IPHONEOS
:
1056 case LC_VERSION_MIN_TVOS
:
1057 case LC_VERSION_MIN_WATCHOS
:
1058 case LC_SOURCE_VERSION
:
1059 /* Not supported for object files, fall through */
1061 rval
= KERN_FAILURE
;
1062 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
1063 "Invalid load command type in MH_OBJECT kext: %u.", cmd_hdr
->cmd
);
1070 /* Get the number of sections from the segment and build the section index */
1072 rval
= kxld_array_init(&object
->sects
, sizeof(KXLDSect
), nsects
);
1073 require_noerr(rval
, finish
);
1075 /* Loop over all of the sections to initialize the section index */
1077 for (i
= 0; i
< nsects
; ++i
) {
1078 sect
= kxld_array_get_item(&object
->sects
, i
);
1080 KXLD_3264_FUNC(kxld_object_is_32_bit(object
), rval
,
1081 kxld_sect_init_from_macho_32
, kxld_sect_init_from_macho_64
,
1082 sect
, my_file
, §_offset
, i
, &object
->relocator
);
1083 require_noerr(rval
, finish
);
1086 /* Create special sections */
1088 #if KXLD_USER_OR_GOT
1089 rval
= create_got(object
);
1090 require_noerr(rval
, finish
);
1091 #endif /* KXLD_USER_OR_GOT */
1093 #if KXLD_USER_OR_COMMON
1094 rval
= resolve_common_symbols(object
);
1095 require_noerr(rval
, finish
);
1096 #endif /* KXLD_USER_OR_COMMON */
1098 /* Create the segments from the section index */
1100 rval
= kxld_seg_create_seg_from_sections(&object
->segs
, &object
->sects
);
1101 require_noerr(rval
, finish
);
1103 rval
= kxld_seg_finalize_object_segment(&object
->segs
,
1104 object
->section_order
, get_macho_header_size(object
));
1105 require_noerr(rval
, finish
);
1107 rval
= kxld_seg_init_linkedit(&object
->segs
);
1108 require_noerr(rval
, finish
);
1111 rval
= KERN_SUCCESS
;
1115 #endif /* KXLD_USER_OR_OBJECT */
1117 #if KXLD_USER_OR_ILP32
1118 /*******************************************************************************
1119 *******************************************************************************/
1121 get_macho_cmd_data_32(u_char
*file
, u_long offset
, u_int
*filetype
, u_int
*ncmds
)
1123 struct mach_header
*mach_hdr
= (struct mach_header
*) ((void *) (file
+ offset
));
1125 if (filetype
) *filetype
= mach_hdr
->filetype
;
1126 if (ncmds
) *ncmds
= mach_hdr
->ncmds
;
1128 return sizeof(*mach_hdr
);
1131 #endif /* KXLD_USER_OR_ILP32 */
1133 #if KXLD_USER_OR_LP64
1134 /*******************************************************************************
1135 *******************************************************************************/
1137 get_macho_cmd_data_64(u_char
*file
, u_long offset
, u_int
*filetype
, u_int
*ncmds
)
1139 struct mach_header_64
*mach_hdr
= (struct mach_header_64
*) ((void *) (file
+ offset
));
1141 if (filetype
) *filetype
= mach_hdr
->filetype
;
1142 if (ncmds
) *ncmds
= mach_hdr
->ncmds
;
1144 return sizeof(*mach_hdr
);
1146 #endif /* KXLD_USER_OR_LP64 */
1148 /*******************************************************************************
1149 *******************************************************************************/
1151 get_macho_header_size(const KXLDObject
*object
)
1153 KXLDSeg
*seg
= NULL
;
1154 u_long header_size
= 0;
1156 boolean_t object_is_32_bit
= kxld_object_is_32_bit(object
);
1160 /* Mach, segment, symtab, and UUID headers */
1162 header_size
+= object_is_32_bit
? sizeof(struct mach_header
) : sizeof(struct mach_header_64
);
1164 for (i
= 0; i
< object
->segs
.nitems
; ++i
) {
1165 seg
= kxld_array_get_item(&object
->segs
, i
);
1166 header_size
+= kxld_seg_get_macho_header_size(seg
, object_is_32_bit
);
1169 header_size
+= kxld_symtab_get_macho_header_size();
1172 if (target_supports_slideable_kexts(object
)) {
1173 header_size
+= kxld_reloc_get_macho_header_size();
1175 #endif /* KXLD_PIC_KEXTS */
1177 if (object
->uuid
.has_uuid
) {
1178 header_size
+= kxld_uuid_get_macho_header_size();
1181 if (object
->versionmin
.has_versionmin
) {
1182 header_size
+= kxld_versionmin_get_macho_header_size();
1185 if (object
->srcversion
.has_srcversion
) {
1186 header_size
+= kxld_srcversion_get_macho_header_size();
1189 if (isSplitKext
&& object
->splitinfolc
.has_splitinfolc
) {
1190 header_size
+= kxld_splitinfolc_get_macho_header_size();
1196 /*******************************************************************************
1197 *******************************************************************************/
1199 get_macho_data_size(const KXLDObject
*object
)
1201 KXLDSeg
*seg
= NULL
;
1202 u_long data_size
= 0;
1207 /* total all segment vmsize values */
1208 for (i
= 0; i
< object
->segs
.nitems
; ++i
) {
1209 seg
= kxld_array_get_item(&object
->segs
, i
);
1210 data_size
+= (u_long
) kxld_seg_get_vmsize(seg
);
1215 /* ensure that when we eventually emit the final linked object,
1216 * appending the __DYSYMTAB data after the __LINKEDIT data will
1217 * not overflow the space allocated for the __LINKEDIT segment
1220 u_long seg_vmsize
= 0;
1221 u_long symtab_size
= 0;
1222 u_long reloc_size
= 0;
1224 /* get current __LINKEDIT sizes */
1225 seg
= kxld_object_get_seg_by_name(object
, SEG_LINKEDIT
);
1227 seg_vmsize
= (u_long
) kxld_seg_get_vmsize(seg
);
1229 /* get size of symbol table data that will eventually be dumped
1230 * into the __LINKEDIT segment
1232 symtab_size
= kxld_symtab_get_macho_data_size(object
->symtab
, kxld_object_is_32_bit(object
));
1234 if (target_supports_slideable_kexts(object
)) {
1235 /* get size of __DYSYMTAB relocation entries */
1236 reloc_size
= kxld_reloc_get_macho_data_size(&object
->locrelocs
, &object
->extrelocs
);
1239 /* combine, and ensure they'll both fit within the page(s)
1240 * allocated for the __LINKEDIT segment. If they'd overflow,
1241 * increase the vmsize appropriately so no overflow will occur
1243 if ((symtab_size
+ reloc_size
) > seg_vmsize
) {
1244 u_long overflow
= (symtab_size
+ reloc_size
) - seg_vmsize
;
1245 data_size
+= kxld_round_page_cross_safe(overflow
);
1248 #endif // KXLD_PIC_KEXTS
1253 /*******************************************************************************
1254 *******************************************************************************/
1256 kxld_object_target_needs_swap(const KXLDObject
*object __unused
)
1261 return (object
->target_order
!= object
->host_order
);
1265 /*******************************************************************************
1266 *******************************************************************************/
1268 kxld_object_get_seg_by_name(const KXLDObject
*object
, const char *segname
)
1270 KXLDSeg
*seg
= NULL
;
1273 for (i
= 0; i
< object
->segs
.nitems
; ++i
) {
1274 seg
= kxld_array_get_item(&object
->segs
, i
);
1276 if (streq_safe(segname
, seg
->segname
, sizeof(seg
->segname
))) break;
1284 /*******************************************************************************
1285 *******************************************************************************/
1286 const KXLDRelocator
*
1287 kxld_object_get_relocator(const KXLDObject
* object
)
1291 return &object
->relocator
;
1294 /*******************************************************************************
1295 *******************************************************************************/
1297 kxld_object_get_sect_by_name(const KXLDObject
*object
, const char *segname
,
1298 const char *sectname
)
1300 KXLDSect
*sect
= NULL
;
1303 for (i
= 0; i
< object
->sects
.nitems
; ++i
) {
1304 sect
= kxld_array_get_item(&object
->sects
, i
);
1306 if (streq_safe(segname
, sect
->segname
, sizeof(sect
->segname
)) &&
1307 streq_safe(sectname
, sect
->sectname
, sizeof(sect
->sectname
)))
1318 /*******************************************************************************
1319 *******************************************************************************/
1321 kxld_object_get_reloc_at_symbol(const KXLDObject
*object
, const KXLDSym
*sym
)
1323 const KXLDReloc
*reloc
= NULL
;
1324 const KXLDSect
*sect
= NULL
;
1325 uint32_t offset
= 0;
1330 sect
= kxld_object_get_section_by_index(object
, sym
->sectnum
);
1331 require(sect
, finish
);
1333 if (kxld_object_is_final_image(object
)) {
1334 reloc
= kxld_reloc_get_reloc_by_offset(&object
->extrelocs
,
1337 reloc
= kxld_reloc_get_reloc_by_offset(&object
->locrelocs
,
1341 offset
= kxld_sym_get_section_offset(sym
, sect
);
1342 reloc
= kxld_reloc_get_reloc_by_offset(§
->relocs
, offset
);
1349 /*******************************************************************************
1350 *******************************************************************************/
1352 kxld_object_get_symbol_of_reloc(const KXLDObject
*object
,
1353 const KXLDReloc
*reloc
, const KXLDSect
*sect
)
1355 const KXLDSym
*sym
= NULL
;
1358 if (isOldInterface
) {
1359 my_file
= object
->file
;
1362 my_file
= object
->split_info
.kextExecutable
;
1365 if (kxld_object_is_final_image(object
)) {
1366 sym
= kxld_reloc_get_symbol(&object
->relocator
, reloc
, my_file
);
1368 sym
= kxld_reloc_get_symbol(&object
->relocator
, reloc
, sect
->data
);
1373 /*******************************************************************************
1374 *******************************************************************************/
1376 kxld_object_get_section_by_index(const KXLDObject
*object
, u_int sectnum
)
1378 KXLDSect
*sect
= NULL
;
1382 if (sectnum
< object
->sects
.nitems
) {
1383 sect
= kxld_array_get_item(&object
->sects
, sectnum
);
1389 /*******************************************************************************
1390 *******************************************************************************/
1392 kxld_object_get_extrelocs(const KXLDObject
*object
)
1394 const KXLDArray
*rval
= NULL
;
1398 if (kxld_object_is_final_image(object
)) {
1399 rval
= &object
->extrelocs
;
1405 /*******************************************************************************
1406 *******************************************************************************/
1408 kxld_object_get_symtab(const KXLDObject
*object
)
1412 return object
->symtab
;
1415 #if KXLD_USER_OR_GOT || KXLD_USER_OR_COMMON
1416 /*******************************************************************************
1417 *******************************************************************************/
1418 static kern_return_t
1419 add_section(KXLDObject
*object
, KXLDSect
**sect
)
1421 kern_return_t rval
= KERN_FAILURE
;
1422 u_int nsects
= object
->sects
.nitems
;
1424 rval
= kxld_array_resize(&object
->sects
, nsects
+ 1);
1425 require_noerr(rval
, finish
);
1427 *sect
= kxld_array_get_item(&object
->sects
, nsects
);
1429 rval
= KERN_SUCCESS
;
1434 #endif /* KXLD_USER_OR_GOT || KXLD_USER_OR_COMMON */
1436 #if KXLD_USER_OR_COMMON
1437 /*******************************************************************************
1438 * If there are common symbols, calculate how much space they'll need
1439 * and create/grow the __DATA __common section to accommodate them.
1440 * Then, resolve them against that section.
1441 *******************************************************************************/
1442 static kern_return_t
1443 resolve_common_symbols(KXLDObject
*object
)
1445 kern_return_t rval
= KERN_FAILURE
;
1446 KXLDSymtabIterator iter
;
1447 KXLDSym
*sym
= NULL
;
1448 KXLDSect
*sect
= NULL
;
1449 kxld_addr_t base_addr
= 0;
1450 kxld_size_t size
= 0;
1451 kxld_size_t total_size
= 0;
1453 u_int max_align
= 0;
1456 if (!kxld_object_target_supports_common_symbols(object
)) {
1457 rval
= KERN_SUCCESS
;
1461 /* Iterate over the common symbols to calculate their total aligned size */
1462 kxld_symtab_iterator_init(&iter
, object
->symtab
, kxld_sym_is_common
, FALSE
);
1463 while ((sym
= kxld_symtab_iterator_get_next(&iter
))) {
1464 align
= kxld_sym_get_common_align(sym
);
1465 size
= kxld_sym_get_common_size(sym
);
1467 if (align
> max_align
) max_align
= align
;
1469 total_size
= kxld_align_address(total_size
, align
) + size
;
1472 /* If there are common symbols, grow or create the __DATA __common section
1476 sect
= kxld_object_get_sect_by_name(object
, SEG_DATA
, SECT_COMMON
);
1478 base_addr
= sect
->base_addr
+ sect
->size
;
1480 kxld_sect_grow(sect
, total_size
, max_align
);
1484 rval
= add_section(object
, §
);
1485 require_noerr(rval
, finish
);
1487 kxld_sect_init_zerofill(sect
, SEG_DATA
, SECT_COMMON
,
1488 total_size
, max_align
);
1491 /* Resolve the common symbols against the new section */
1492 rval
= kxld_array_get_index(&object
->sects
, sect
, §num
);
1493 require_noerr(rval
, finish
);
1495 kxld_symtab_iterator_reset(&iter
);
1496 while ((sym
= kxld_symtab_iterator_get_next(&iter
))) {
1497 align
= kxld_sym_get_common_align(sym
);
1498 size
= kxld_sym_get_common_size(sym
);
1500 base_addr
= kxld_align_address(base_addr
, align
);
1501 kxld_sym_resolve_common(sym
, sectnum
, base_addr
);
1507 rval
= KERN_SUCCESS
;
1512 #endif /* KXLD_USER_OR_COMMON */
1514 #if KXLD_USER_OR_GOT
1515 /*******************************************************************************
1516 *******************************************************************************/
1518 target_has_got(const KXLDObject
*object
)
1523 /*******************************************************************************
1524 * Create and initialize the Global Offset Table
1525 *******************************************************************************/
1526 static kern_return_t
1527 create_got(KXLDObject
*object
)
1529 kern_return_t rval
= KERN_FAILURE
;
1530 KXLDSect
*sect
= NULL
;
1534 if (!target_has_got(object
)) {
1535 rval
= KERN_SUCCESS
;
1539 for (i
= 0; i
< object
->sects
.nitems
; ++i
) {
1540 sect
= kxld_array_get_item(&object
->sects
, i
);
1541 ngots
+= kxld_sect_get_ngots(sect
, &object
->relocator
,
1545 rval
= add_section(object
, §
);
1546 require_noerr(rval
, finish
);
1548 rval
= kxld_sect_init_got(sect
, ngots
);
1549 require_noerr(rval
, finish
);
1551 object
->got_is_created
= TRUE
;
1552 rval
= KERN_SUCCESS
;
1558 /*******************************************************************************
1559 *******************************************************************************/
1560 static kern_return_t
1561 populate_got(KXLDObject
*object
)
1563 kern_return_t rval
= KERN_FAILURE
;
1564 KXLDSect
*sect
= NULL
;
1567 if (!target_has_got(object
) || !object
->got_is_created
) {
1568 rval
= KERN_SUCCESS
;
1572 for (i
= 0; i
< object
->sects
.nitems
; ++i
) {
1573 sect
= kxld_array_get_item(&object
->sects
, i
);
1574 if (streq_safe(sect
->segname
, KXLD_SEG_GOT
, sizeof(KXLD_SEG_GOT
)) &&
1575 streq_safe(sect
->sectname
, KXLD_SECT_GOT
, sizeof(KXLD_SECT_GOT
)))
1577 kxld_sect_populate_got(sect
, object
->symtab
,
1578 kxld_object_target_needs_swap(object
));
1583 require_action(i
< object
->sects
.nitems
, finish
, rval
=KXLD_MISSING_GOT
);
1585 rval
= KERN_SUCCESS
;
1590 #endif /* KXLD_USER_OR_GOT */
1592 /*******************************************************************************
1593 *******************************************************************************/
1595 target_supports_protected_segments(const KXLDObject
*object
)
1597 return (object
->is_final_image
&&
1598 (object
->cputype
== CPU_TYPE_X86_64
||
1599 object
->cputype
== CPU_TYPE_ARM
||
1600 object
->cputype
== CPU_TYPE_ARM64
));
1603 /*******************************************************************************
1604 *******************************************************************************/
1606 set_is_object_linked(KXLDObject
*object
)
1610 if (kxld_object_is_kernel(object
)) {
1611 object
->is_linked
= TRUE
;
1615 if (object
->is_final_image
) {
1616 object
->is_linked
= !object
->extrelocs
.nitems
;
1620 object
->is_linked
= TRUE
;
1621 for (i
= 0; i
< object
->sects
.nitems
; ++i
) {
1622 KXLDSect
*sect
= kxld_array_get_item(&object
->sects
, i
);
1623 if (sect
->relocs
.nitems
) {
1624 object
->is_linked
= FALSE
;
1631 /*******************************************************************************
1632 *******************************************************************************/
1633 void kxld_object_clear(KXLDObject
*object
)
1635 KXLDSeg
*seg
= NULL
;
1636 KXLDSect
*sect
= NULL
;
1642 if (isOldInterface
) {
1643 my_file
= object
->file
;
1646 my_file
= object
->split_info
.kextExecutable
;
1650 if (kxld_object_is_kernel(object
)) {
1651 unswap_macho(my_file
, object
->host_order
, object
->target_order
);
1653 #endif /* !KERNEL */
1655 for (i
= 0; i
< object
->segs
.nitems
; ++i
) {
1656 seg
= kxld_array_get_item(&object
->segs
, i
);
1657 kxld_seg_clear(seg
);
1659 kxld_array_reset(&object
->segs
);
1661 for (i
= 0; i
< object
->sects
.nitems
; ++i
) {
1662 sect
= kxld_array_get_item(&object
->sects
, i
);
1663 kxld_sect_clear(sect
);
1665 kxld_array_reset(&object
->sects
);
1667 kxld_array_reset(&object
->extrelocs
);
1668 kxld_array_reset(&object
->locrelocs
);
1669 kxld_relocator_clear(&object
->relocator
);
1670 kxld_uuid_clear(&object
->uuid
);
1671 kxld_versionmin_clear(&object
->versionmin
);
1672 kxld_srcversion_clear(&object
->srcversion
);
1674 if (object
->symtab
) kxld_symtab_clear(object
->symtab
);
1676 if (isOldInterface
) {
1677 object
->file
= NULL
;
1681 kxld_splitinfolc_clear(&object
->splitinfolc
);
1682 object
->split_info
.kextExecutable
= NULL
;
1683 object
->split_info
.kextSize
= 0;
1685 object
->filetype
= 0;
1686 object
->cputype
= 0;
1687 object
->cpusubtype
= 0;
1688 object
->is_kernel
= FALSE
;
1689 object
->is_final_image
= FALSE
;
1690 object
->is_linked
= FALSE
;
1691 object
->got_is_created
= FALSE
;
1693 #if KXLD_USER_OR_OBJECT
1694 object
->section_order
= NULL
;
1697 object
->host_order
= 0;
1698 object
->target_order
= 0;
1702 /*******************************************************************************
1703 *******************************************************************************/
1704 void kxld_object_deinit(KXLDObject
*object __unused
)
1706 KXLDSeg
*seg
= NULL
;
1707 KXLDSect
*sect
= NULL
;
1713 if (isOldInterface
) {
1714 my_file
= object
->file
;
1717 my_file
= object
->split_info
.kextExecutable
;
1721 if (my_file
&& kxld_object_is_kernel(object
)) {
1722 unswap_macho(my_file
, object
->host_order
, object
->target_order
);
1724 #endif /* !KERNEL */
1726 for (i
= 0; i
< object
->segs
.maxitems
; ++i
) {
1727 seg
= kxld_array_get_slot(&object
->segs
, i
);
1728 kxld_seg_deinit(seg
);
1730 kxld_array_deinit(&object
->segs
);
1732 for (i
= 0; i
< object
->sects
.maxitems
; ++i
) {
1733 sect
= kxld_array_get_slot(&object
->sects
, i
);
1734 kxld_sect_deinit(sect
);
1736 kxld_array_deinit(&object
->sects
);
1738 kxld_array_deinit(&object
->extrelocs
);
1739 kxld_array_deinit(&object
->locrelocs
);
1741 if (object
->symtab
) {
1742 kxld_symtab_deinit(object
->symtab
);
1743 kxld_free(object
->symtab
, kxld_symtab_sizeof());
1746 bzero(object
, sizeof(*object
));
1749 /*******************************************************************************
1750 *******************************************************************************/
1752 kxld_object_get_file(const KXLDObject
*object
)
1754 const u_char
*my_file
;
1758 if (isOldInterface
) {
1759 my_file
= object
->file
;
1762 my_file
= object
->split_info
.kextExecutable
;
1768 /*******************************************************************************
1769 *******************************************************************************/
1771 kxld_object_get_name(const KXLDObject
*object
)
1775 return object
->name
;
1778 /*******************************************************************************
1779 *******************************************************************************/
1781 kxld_object_is_32_bit(const KXLDObject
*object
)
1785 return kxld_is_32_bit(object
->cputype
);
1788 /*******************************************************************************
1789 *******************************************************************************/
1791 kxld_object_is_final_image(const KXLDObject
*object
)
1795 return object
->is_final_image
;
1798 /*******************************************************************************
1799 *******************************************************************************/
1801 kxld_object_is_kernel(const KXLDObject
*object
)
1805 return object
->is_kernel
;
1808 /*******************************************************************************
1809 *******************************************************************************/
1811 kxld_object_is_linked(const KXLDObject
*object
)
1815 return object
->is_linked
;
1818 /*******************************************************************************
1819 *******************************************************************************/
1821 kxld_object_target_supports_strict_patching(const KXLDObject
*object
)
1825 return (object
->cputype
!= CPU_TYPE_I386
);
1828 /*******************************************************************************
1829 *******************************************************************************/
1831 kxld_object_target_supports_common_symbols(const KXLDObject
*object
)
1835 return (object
->cputype
== CPU_TYPE_I386
);
1839 /*******************************************************************************
1840 *******************************************************************************/
1842 kxld_object_get_vmsize_for_seg_by_name(const KXLDObject
*object
,
1843 const char *segname
,
1850 KXLDSeg
*seg
= NULL
;
1853 /* segment vmsize */
1854 seg
= kxld_object_get_seg_by_name(object
, segname
);
1856 my_size
= (u_long
) kxld_seg_get_vmsize(seg
);
1859 if (kxld_seg_is_linkedit_seg(seg
))
1861 u_long reloc_size
= 0;
1863 if (target_supports_slideable_kexts(object
)) {
1864 /* get size of __DYSYMTAB relocation entries */
1865 reloc_size
= kxld_reloc_get_macho_data_size(&object
->locrelocs
, &object
->extrelocs
);
1866 my_size
+= reloc_size
;
1874 /*******************************************************************************
1875 *******************************************************************************/
1877 kxld_object_get_vmsize(const KXLDObject
*object
, u_long
*header_size
,
1886 /* vmsize is the padded header page(s) + segment vmsizes */
1888 *header_size
= (object
->is_final_image
) ?
1889 0 : (u_long
)kxld_round_page_cross_safe(get_macho_header_size(object
));
1891 *vmsize
= *header_size
+ get_macho_data_size(object
);
1895 /*******************************************************************************
1896 *******************************************************************************/
1898 kxld_object_set_linked_object_size(KXLDObject
*object
, u_long vmsize
)
1902 if (isOldInterface
) {
1903 object
->output_buffer_size
= vmsize
; /* cache this for use later */
1906 object
->split_info
.linkedKextSize
= vmsize
;
1911 /*******************************************************************************
1912 *******************************************************************************/
1914 kxld_object_export_linked_object(const KXLDObject
*object
,
1918 kern_return_t rval
= KERN_FAILURE
;
1919 KXLDSeg
*seg
= NULL
;
1921 u_long header_size
= 0;
1922 u_long header_offset
= 0;
1923 u_long data_offset
= 0;
1926 boolean_t is_32bit_object
= kxld_object_is_32_bit(object
);
1927 kxld_addr_t link_addr
;
1928 u_char
*my_linked_object
;
1931 check(linked_object
);
1933 if (isOldInterface
) {
1934 size
= object
->output_buffer_size
;
1935 link_addr
= object
->link_addr
;
1936 my_linked_object
= (u_char
*) linked_object
;
1939 size
= ((splitKextLinkInfo
*)linked_object
)->linkedKextSize
;
1940 link_addr
= ((splitKextLinkInfo
*)linked_object
)->vmaddr_TEXT
;
1941 my_linked_object
= ((splitKextLinkInfo
*)linked_object
)->linkedKext
;
1944 /* Calculate the size of the headers and data */
1946 header_size
= get_macho_header_size(object
);
1948 /* Copy data to the file */
1950 ncmds
= object
->segs
.nitems
+ 1 /* LC_SYMTAB */;
1953 /* don't write out a DYSYMTAB segment for targets that can't digest it
1955 if (target_supports_slideable_kexts(object
)) {
1956 ncmds
++; /* dysymtab */
1958 #endif /* KXLD_PIC_KEXTS */
1960 if (object
->uuid
.has_uuid
== TRUE
) {
1964 if (object
->versionmin
.has_versionmin
== TRUE
) {
1968 if (object
->srcversion
.has_srcversion
== TRUE
) {
1972 if (isSplitKext
&& object
->splitinfolc
.has_splitinfolc
) {
1976 rval
= export_macho_header(object
, my_linked_object
, ncmds
, &header_offset
, header_size
);
1977 require_noerr(rval
, finish
);
1979 for (i
= 0; i
< object
->segs
.nitems
; ++i
) {
1980 seg
= kxld_array_get_item(&object
->segs
, i
);
1982 rval
= kxld_seg_export_macho_to_vm(seg
, my_linked_object
, &header_offset
,
1983 header_size
, size
, link_addr
, is_32bit_object
);
1984 require_noerr(rval
, finish
);
1987 seg
= kxld_object_get_seg_by_name(object
, SEG_LINKEDIT
);
1988 data_offset
= (u_long
) (seg
->link_addr
- link_addr
);
1990 // data_offset is used to set the fileoff in the macho header load commands
1991 rval
= kxld_symtab_export_macho(object
->symtab
,
1995 &data_offset
, size
, is_32bit_object
);
1996 require_noerr(rval
, finish
);
1998 // data_offset now points past the symbol tab and strings data in the linkedit
1999 // segment - (it was used to set new values for symoff and stroff)
2002 if (target_supports_slideable_kexts(object
)) {
2003 rval
= kxld_reloc_export_macho(&object
->relocator
,
2009 &data_offset
, size
);
2010 require_noerr(rval
, finish
);
2012 #endif /* KXLD_PIC_KEXTS */
2014 if (object
->uuid
.has_uuid
) {
2015 rval
= kxld_uuid_export_macho(&object
->uuid
, my_linked_object
, &header_offset
, header_size
);
2016 require_noerr(rval
, finish
);
2019 if (object
->versionmin
.has_versionmin
) {
2020 rval
= kxld_versionmin_export_macho(&object
->versionmin
, my_linked_object
, &header_offset
, header_size
);
2021 require_noerr(rval
, finish
);
2024 if (object
->srcversion
.has_srcversion
) {
2025 rval
= kxld_srcversion_export_macho(&object
->srcversion
, my_linked_object
, &header_offset
, header_size
);
2026 require_noerr(rval
, finish
);
2029 if (isSplitKext
&& object
->splitinfolc
.has_splitinfolc
) {
2030 rval
= kxld_splitinfolc_export_macho(&object
->splitinfolc
,
2036 require_noerr(rval
, finish
);
2040 unswap_macho(my_linked_object
, object
->host_order
, object
->target_order
);
2043 rval
= KERN_SUCCESS
;
2049 /*******************************************************************************
2050 *******************************************************************************/
2051 static kern_return_t
2052 export_macho_header(const KXLDObject
*object
, u_char
*buf
, u_int ncmds
,
2053 u_long
*header_offset
, u_long header_size
)
2055 kern_return_t rval
= KERN_FAILURE
;
2059 check(header_offset
);
2061 KXLD_3264_FUNC(kxld_object_is_32_bit(object
), rval
,
2062 export_macho_header_32
, export_macho_header_64
,
2063 object
, buf
, ncmds
, header_offset
, header_size
);
2064 require_noerr(rval
, finish
);
2066 rval
= KERN_SUCCESS
;
2072 #if KXLD_USER_OR_ILP32
2073 /*******************************************************************************
2074 *******************************************************************************/
2075 static kern_return_t
2076 export_macho_header_32(const KXLDObject
*object
, u_char
*buf
, u_int ncmds
,
2077 u_long
*header_offset
, u_long header_size
)
2079 kern_return_t rval
= KERN_FAILURE
;
2080 struct mach_header
*mach
= NULL
;
2084 check(header_offset
);
2086 require_action(sizeof(*mach
) <= header_size
- *header_offset
, finish
,
2088 mach
= (struct mach_header
*) ((void *) (buf
+ *header_offset
));
2090 mach
->magic
= MH_MAGIC
;
2091 mach
->cputype
= object
->cputype
;
2092 mach
->cpusubtype
= object
->cpusubtype
;
2093 mach
->filetype
= object
->filetype
;
2094 mach
->ncmds
= ncmds
;
2095 mach
->sizeofcmds
= (uint32_t) (header_size
- sizeof(*mach
));
2096 mach
->flags
= MH_NOUNDEFS
;
2098 *header_offset
+= sizeof(*mach
);
2100 rval
= KERN_SUCCESS
;
2105 #endif /* KXLD_USER_OR_ILP32 */
2107 #if KXLD_USER_OR_LP64
2108 /*******************************************************************************
2109 *******************************************************************************/
2110 static kern_return_t
2111 export_macho_header_64(const KXLDObject
*object
, u_char
*buf
, u_int ncmds
,
2112 u_long
*header_offset
, u_long header_size
)
2114 kern_return_t rval
= KERN_FAILURE
;
2115 struct mach_header_64
*mach
= NULL
;
2119 check(header_offset
);
2121 require_action(sizeof(*mach
) <= header_size
- *header_offset
, finish
,
2123 mach
= (struct mach_header_64
*) ((void *) (buf
+ *header_offset
));
2125 mach
->magic
= MH_MAGIC_64
;
2126 mach
->cputype
= object
->cputype
;
2127 mach
->cpusubtype
= object
->cpusubtype
;
2128 mach
->filetype
= object
->filetype
;
2129 mach
->ncmds
= ncmds
;
2130 mach
->sizeofcmds
= (uint32_t) (header_size
- sizeof(*mach
));
2131 mach
->flags
= MH_NOUNDEFS
;
2133 *header_offset
+= sizeof(*mach
);
2135 #if SPLIT_KEXTS_DEBUG
2137 kxld_log(kKxldLogLinking
, kKxldLogErr
,
2138 " %p >>> Start of macho header (size %lu) <%s>",
2142 kxld_log(kKxldLogLinking
, kKxldLogErr
,
2143 " %p <<< End of macho header <%s>",
2144 (void *) ((u_char
*)mach
+ sizeof(*mach
)),
2149 rval
= KERN_SUCCESS
;
2154 #endif /* KXLD_USER_OR_LP64 */
2156 /*******************************************************************************
2157 *******************************************************************************/
2159 kxld_object_index_symbols_by_name(KXLDObject
*object
)
2161 return kxld_symtab_index_symbols_by_name(object
->symtab
);
2164 /*******************************************************************************
2165 *******************************************************************************/
2167 kxld_object_index_cxx_symbols_by_value(KXLDObject
*object
)
2169 return kxld_symtab_index_cxx_symbols_by_value(object
->symtab
);
2172 /*******************************************************************************
2173 *******************************************************************************/
2175 kxld_object_relocate(KXLDObject
*object
, kxld_addr_t link_address
)
2177 kern_return_t rval
= KERN_FAILURE
;
2178 KXLDSeg
*seg
= NULL
;
2183 object
->link_addr
= link_address
;
2185 /* Relocate segments (which relocates the sections) */
2186 for (i
= 0; i
< object
->segs
.nitems
; ++i
) {
2187 seg
= kxld_array_get_item(&object
->segs
, i
);
2188 kxld_seg_relocate(seg
, link_address
);
2191 /* Relocate symbols */
2192 rval
= kxld_symtab_relocate(object
->symtab
, &object
->sects
);
2193 require_noerr(rval
, finish
);
2195 rval
= KERN_SUCCESS
;
2200 /*******************************************************************************
2201 *******************************************************************************/
2203 get_mutable_sym(const KXLDObject
*object
, const KXLDSym
*sym
)
2205 KXLDSym
*rval
= NULL
;
2206 kern_return_t result
= KERN_FAILURE
;
2209 result
= kxld_symtab_get_sym_index(object
->symtab
, sym
, &i
);
2210 require_noerr(result
, finish
);
2212 rval
= kxld_symtab_get_symbol_by_index(object
->symtab
, i
);
2213 require_action(rval
== sym
, finish
, rval
=NULL
);
2219 /*******************************************************************************
2220 *******************************************************************************/
2222 kxld_object_resolve_symbol(KXLDObject
*object
,
2223 const KXLDSym
*sym
, kxld_addr_t addr
)
2225 kern_return_t rval
= KERN_FAILURE
;
2226 KXLDSym
*resolved_sym
= NULL
;
2228 resolved_sym
= get_mutable_sym(object
, sym
);
2229 require_action(resolved_sym
, finish
, rval
=KERN_FAILURE
);
2231 rval
= kxld_sym_resolve(resolved_sym
, addr
);
2232 require_noerr(rval
, finish
);
2234 rval
= KERN_SUCCESS
;
2239 /*******************************************************************************
2240 *******************************************************************************/
2242 kxld_object_patch_symbol(KXLDObject
*object
, const struct kxld_sym
*sym
)
2244 kern_return_t rval
= KERN_FAILURE
;
2245 KXLDSym
*patched_sym
= NULL
;
2247 patched_sym
= get_mutable_sym(object
, sym
);
2248 require_action(patched_sym
, finish
, rval
=KERN_FAILURE
);
2250 (void) kxld_sym_patch(patched_sym
);
2251 rval
= KERN_SUCCESS
;
2256 /*******************************************************************************
2257 *******************************************************************************/
2259 kxld_object_add_symbol(KXLDObject
*object
, char *name
, kxld_addr_t link_addr
,
2260 const KXLDSym
**sym_out
)
2262 kern_return_t rval
= KERN_FAILURE
;
2263 KXLDSym
*sym
= NULL
;
2265 rval
= kxld_symtab_add_symbol(object
->symtab
, name
, link_addr
, &sym
);
2266 require_noerr(rval
, finish
);
2269 rval
= KERN_SUCCESS
;
2274 /*******************************************************************************
2275 *******************************************************************************/
2277 kxld_object_process_relocations(KXLDObject
*object
,
2278 const KXLDDict
*patched_vtables
)
2280 kern_return_t rval
= KERN_FAILURE
;
2282 (void) kxld_relocator_set_vtables(&object
->relocator
, patched_vtables
);
2284 /* Process relocation entries and populate the global offset table.
2286 * For final linked images: the relocation entries are contained in a couple
2287 * of tables hanging off the end of the symbol table. The GOT has its own
2288 * section created by the linker; we simply need to fill it.
2290 * For object files: the relocation entries are bound to each section.
2291 * The GOT, if it exists for the target architecture, is created by kxld,
2292 * and we must populate it according to our internal structures.
2294 if (object
->is_final_image
) {
2295 #if KXLD_USER_OR_BUNDLE
2296 rval
= process_symbol_pointers(object
);
2297 require_noerr(rval
, finish
);
2299 rval
= process_relocs_from_tables(object
);
2300 require_noerr(rval
, finish
);
2302 require_action(FALSE
, finish
, rval
=KERN_FAILURE
);
2303 #endif /* KXLD_USER_OR_BUNDLE */
2305 #if KXLD_USER_OR_GOT
2307 rval
= populate_got(object
);
2308 require_noerr(rval
, finish
);
2309 #endif /* KXLD_USER_OR_GOT */
2310 #if KXLD_USER_OR_OBJECT
2311 rval
= process_relocs_from_sections(object
);
2312 require_noerr(rval
, finish
);
2314 require_action(FALSE
, finish
, rval
=KERN_FAILURE
);
2315 #endif /* KXLD_USER_OR_OBJECT */
2318 /* Populate kmod info structure */
2319 rval
= populate_kmod_info(object
);
2320 require_noerr(rval
, finish
);
2322 rval
= KERN_SUCCESS
;
2327 #if KXLD_USER_OR_BUNDLE
2329 #if SPLIT_KEXTS_DEBUG
2330 static boolean_t kxld_show_ptr_value
;
2333 #define SECT_SYM_PTRS "__nl_symbol_ptr"
2335 /*******************************************************************************
2336 * Final linked images create an __nl_symbol_ptr section for the global offset
2337 * table and for symbol pointer lookups in general. Rather than use relocation
2338 * entries, the linker creates an "indirect symbol table" which stores indexes
2339 * into the symbol table corresponding to the entries of this section. This
2340 * function populates the section with the relocated addresses of those symbols.
2341 *******************************************************************************/
2342 static kern_return_t
2343 process_symbol_pointers(KXLDObject
*object
)
2345 kern_return_t rval
= KERN_FAILURE
;
2346 KXLDSect
*sect
= NULL
;
2347 KXLDSym
*sym
= NULL
;
2348 int32_t *symidx
= NULL
;
2349 u_char
*symptr
= NULL
;
2350 u_long symptrsize
= 0;
2357 require_action(object
->is_final_image
&& object
->dysymtab_hdr
,
2358 finish
, rval
=KERN_FAILURE
);
2360 /* Get the __DATA,__nl_symbol_ptr section. If it doesn't exist, we have
2364 sect
= kxld_object_get_sect_by_name(object
, SEG_DATA
, SECT_SYM_PTRS
);
2365 if (!sect
|| !(sect
->flags
& S_NON_LAZY_SYMBOL_POINTERS
)) {
2366 rval
= KERN_SUCCESS
;
2370 /* Calculate the table offset and number of entries in the section */
2372 if (kxld_object_is_32_bit(object
)) {
2373 symptrsize
= sizeof(uint32_t);
2375 symptrsize
= sizeof(uint64_t);
2378 nsyms
= (u_int
) (sect
->size
/ symptrsize
);
2379 firstsym
= sect
->reserved1
;
2381 require_action(firstsym
+ nsyms
<= object
->dysymtab_hdr
->nindirectsyms
,
2382 finish
, rval
=KERN_FAILURE
;
2383 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
2384 "firstsym + nsyms > object->dysymtab_hdr->nindirectsyms"));
2386 /* Iterate through the indirect symbol table and fill in the section of
2387 * symbol pointers. There are three cases:
2388 * 1) A normal symbol - put its value directly in the table
2389 * 2) An INDIRECT_SYMBOL_LOCAL - symbols that are local and already have
2390 * their offset from the start of the file in the section. Simply
2391 * add the file's link address to fill this entry.
2392 * 3) An INDIRECT_SYMBOL_ABS - prepopulated absolute symbols. No
2393 * action is required.
2396 if (isOldInterface
) {
2397 symidx
= (int32_t *) ((void *) (object
->file
+ object
->dysymtab_hdr
->indirectsymoff
));
2400 symidx
= (int32_t *) ((void *) (object
->split_info
.kextExecutable
+ object
->dysymtab_hdr
->indirectsymoff
));
2404 symptr
= sect
->data
;
2405 for (i
= 0; i
< nsyms
; ++i
, ++symidx
, symptr
+=symptrsize
) {
2406 if (*symidx
& INDIRECT_SYMBOL_LOCAL
) {
2407 if (*symidx
& INDIRECT_SYMBOL_ABS
) continue;
2409 if (isOldInterface
) {
2410 add_to_ptr(symptr
, object
->link_addr
, kxld_object_is_32_bit(object
));
2413 add_to_ptr(symptr
, object
->split_info
.vmaddr_TEXT
, kxld_object_is_32_bit(object
));
2416 sym
= kxld_symtab_get_symbol_by_index(object
->symtab
, *symidx
);
2417 require_action(sym
, finish
, rval
=KERN_FAILURE
);
2419 if (isOldInterface
) {
2420 add_to_ptr(symptr
, sym
->link_addr
, kxld_object_is_32_bit(object
));
2423 add_to_ptr(symptr
, object
->split_info
.vmaddr_TEXT
, kxld_object_is_32_bit(object
));
2428 rval
= KERN_SUCCESS
;
2433 /*******************************************************************************
2434 *******************************************************************************/
2436 get_seg_by_base_addr(KXLDObject
*object
, kxld_addr_t base_addr
)
2438 KXLDSeg
*seg
= NULL
;
2439 kxld_addr_t start
= 0;
2440 kxld_addr_t end
= 0;
2443 for (i
= 0; i
< object
->segs
.nitems
; ++i
) {
2444 seg
= kxld_array_get_item(&object
->segs
, i
);
2445 start
= seg
->base_addr
;
2446 end
= seg
->base_addr
+ seg
->vmsize
;
2448 if (start
<= base_addr
&& base_addr
< end
) return seg
;
2454 /*******************************************************************************
2455 *******************************************************************************/
2456 static kern_return_t
2457 process_relocs_from_tables(KXLDObject
*object
)
2459 kern_return_t rval
= KERN_FAILURE
;
2460 KXLDReloc
*reloc
= NULL
;
2461 KXLDSeg
*seg
= NULL
;
2464 /* Process external relocations */
2465 for (i
= 0; i
< object
->extrelocs
.nitems
; ++i
) {
2466 reloc
= kxld_array_get_item(&object
->extrelocs
, i
);
2468 seg
= get_seg_by_base_addr(object
, reloc
->address
);
2469 require_action(seg
, finish
, rval
=KERN_FAILURE
);
2471 if (isOldInterface
) {
2472 rval
= kxld_relocator_process_table_reloc(&object
->relocator
, reloc
,
2473 seg
, object
->link_addr
);
2476 kxld_addr_t my_link_addr
= object
->split_info
.vmaddr_TEXT
;
2478 if (kxld_seg_is_text_exec_seg(seg
)) {
2479 my_link_addr
= object
->split_info
.vmaddr_TEXT_EXEC
;
2481 else if (kxld_seg_is_data_seg(seg
)) {
2482 my_link_addr
= object
->split_info
.vmaddr_DATA
;
2484 else if (kxld_seg_is_data_const_seg(seg
)) {
2485 my_link_addr
= object
->split_info
.vmaddr_DATA_CONST
;
2487 else if (kxld_seg_is_linkedit_seg(seg
)) {
2488 my_link_addr
= object
->split_info
.vmaddr_LINKEDIT
;
2491 rval
= kxld_relocator_process_table_reloc(&object
->relocator
,
2496 require_noerr(rval
, finish
);
2499 /* Process local relocations */
2500 for (i
= 0; i
< object
->locrelocs
.nitems
; ++i
) {
2501 reloc
= kxld_array_get_item(&object
->locrelocs
, i
);
2503 seg
= get_seg_by_base_addr(object
, reloc
->address
);
2504 require_action(seg
, finish
, rval
=KERN_FAILURE
);
2506 if (isOldInterface
) {
2507 rval
= kxld_relocator_process_table_reloc(&object
->relocator
, reloc
,
2508 seg
, object
->link_addr
);
2511 kxld_addr_t my_link_addr
= object
->split_info
.vmaddr_TEXT
;
2513 if (kxld_seg_is_text_exec_seg(seg
)) {
2514 my_link_addr
= object
->split_info
.vmaddr_TEXT_EXEC
;
2516 else if (kxld_seg_is_data_seg(seg
)) {
2517 my_link_addr
= object
->split_info
.vmaddr_DATA
;
2519 else if (kxld_seg_is_data_const_seg(seg
)) {
2520 my_link_addr
= object
->split_info
.vmaddr_DATA_CONST
;
2522 else if (kxld_seg_is_linkedit_seg(seg
)) {
2523 my_link_addr
= object
->split_info
.vmaddr_LINKEDIT
;
2526 rval
= kxld_relocator_process_table_reloc(&object
->relocator
,
2531 require_noerr(rval
, finish
);
2534 rval
= KERN_SUCCESS
;
2539 /*******************************************************************************
2540 *******************************************************************************/
2542 add_to_ptr(u_char
*symptr
, kxld_addr_t val
, boolean_t is_32_bit
)
2545 uint32_t *ptr
= (uint32_t *) ((void *) symptr
);
2547 *ptr
+= (uint32_t) val
;
2549 uint64_t *ptr
= (uint64_t *) ((void *) symptr
);
2551 *ptr
+= (uint64_t) val
;
2554 #if SPLIT_KEXTS_DEBUG
2555 kxld_show_ptr_value
= FALSE
;
2559 #endif /* KXLD_USER_OR_BUNDLE */
2561 #if KXLD_USER_OR_OBJECT
2562 /*******************************************************************************
2563 *******************************************************************************/
2564 static kern_return_t
2565 process_relocs_from_sections(KXLDObject
*object
)
2567 kern_return_t rval
= KERN_FAILURE
;
2568 KXLDSect
*sect
= NULL
;
2571 for (i
= 0; i
< object
->sects
.nitems
; ++i
) {
2572 sect
= kxld_array_get_item(&object
->sects
, i
);
2573 rval
= kxld_sect_process_relocs(sect
, &object
->relocator
);
2574 require_noerr(rval
, finish
);
2577 rval
= KERN_SUCCESS
;
2581 #endif /* KXLD_USER_OR_OBJECT */
2583 /*******************************************************************************
2584 *******************************************************************************/
2585 static kern_return_t
2586 populate_kmod_info(KXLDObject
*object
)
2588 kern_return_t rval
= KERN_FAILURE
;
2589 KXLDSect
*kmodsect
= NULL
;
2590 KXLDSym
*kmodsym
= NULL
;
2591 kmod_info_t
*kmod_info
= NULL
;
2592 u_long kmod_offset
= 0;
2596 if (kxld_object_is_kernel(object
)) {
2597 rval
= KERN_SUCCESS
;
2601 kxld_object_get_vmsize(object
, &header_size
, &size
);
2603 kmodsym
= kxld_symtab_get_locally_defined_symbol_by_name(object
->symtab
,
2604 KXLD_KMOD_INFO_SYMBOL
);
2605 require_action(kmodsym
, finish
, rval
=KERN_FAILURE
;
2606 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogNoKmodInfo
));
2608 kmodsect
= kxld_array_get_item(&object
->sects
, kmodsym
->sectnum
);
2610 kmod_offset
= (u_long
) (kmodsym
->base_addr
- kmodsect
->base_addr
);
2611 kmod_info
= (kmod_info_t
*) ((void *) (kmodsect
->data
+ kmod_offset
));
2613 if (kxld_object_is_32_bit(object
)) {
2614 kmod_info_32_v1_t
*kmod
= (kmod_info_32_v1_t
*) (kmod_info
);
2616 if (isOldInterface
) {
2617 kmod
->address
= (uint32_t) object
->link_addr
;
2620 kmod
->address
= (uint32_t) object
->split_info
.vmaddr_TEXT
;
2623 kmod
->size
= (uint32_t) size
;
2624 kmod
->hdr_size
= (uint32_t) header_size
;
2627 if (kxld_object_target_needs_swap(object
)) {
2628 kmod
->address
= OSSwapInt32(kmod
->address
);
2629 kmod
->size
= OSSwapInt32(kmod
->size
);
2630 kmod
->hdr_size
= OSSwapInt32(kmod
->hdr_size
);
2632 #endif /* !KERNEL */
2634 kmod_info_64_v1_t
*kmod
= (kmod_info_64_v1_t
*) (kmod_info
);
2636 if (isOldInterface
) {
2637 kmod
->address
= object
->link_addr
;
2640 kmod
->address
= object
->split_info
.vmaddr_TEXT
;
2644 kmod
->hdr_size
= header_size
;
2647 if (kxld_object_target_needs_swap(object
)) {
2648 kmod
->address
= OSSwapInt64(kmod
->address
);
2649 kmod
->size
= OSSwapInt64(kmod
->size
);
2650 kmod
->hdr_size
= OSSwapInt64(kmod
->hdr_size
);
2652 #endif /* !KERNEL */
2654 #if SPLIT_KEXTS_DEBUG
2656 kxld_log(kKxldLogLinking
, kKxldLogErr
,
2657 " kmodsect %p kmod_info %p = kmodsect->data %p + kmod_offset %lu <%s>",
2660 (void *) kmodsect
->data
,
2664 kxld_log(kKxldLogLinking
, kKxldLogErr
,
2665 " kmod_info data: address %p size %llu hdr_size %llu start_addr %p stop_addr %p <%s>",
2666 (void *) kmod
->address
,
2669 (void *) kmod
->start_addr
,
2670 (void *) kmod
->stop_addr
,
2677 rval
= KERN_SUCCESS
;
2684 /*******************************************************************************
2685 *******************************************************************************/
2687 target_supports_slideable_kexts(const KXLDObject
*object
)
2691 return (object
->cputype
!= CPU_TYPE_I386
&& object
->include_kaslr_relocs
);
2693 #endif /* KXLD_PIC_KEXTS */