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>
51 #include <os/overflow.h>
53 #define DEBUG_ASSERT_COMPONENT_NAME_STRING "kxld"
54 #include <AssertMacros.h>
56 #include "kxld_demangle.h"
57 #include "kxld_dict.h"
58 #include "kxld_reloc.h"
59 #include "kxld_sect.h"
61 #include "kxld_srcversion.h"
62 #include "kxld_symtab.h"
63 #include "kxld_util.h"
64 #include "kxld_uuid.h"
65 #include "kxld_versionmin.h"
66 #include "kxld_vtable.h"
67 #include "kxld_splitinfolc.h"
69 #include "kxld_object.h"
71 extern boolean_t isSplitKext
;
72 extern boolean_t isOldInterface
;
74 /*******************************************************************************
76 *******************************************************************************/
79 u_char
*file
; // used by old interface
80 u_long size
; // used by old interface
84 cpu_subtype_t cpusubtype
;
89 KXLDRelocator relocator
;
91 KXLDversionmin versionmin
;
92 KXLDsrcversion srcversion
;
94 struct dysymtab_command
*dysymtab_hdr
;
95 KXLDsplitinfolc splitinfolc
;
96 splitKextLinkInfo split_info
;
97 kxld_addr_t link_addr
;
98 u_long output_buffer_size
;
100 boolean_t is_final_image
;
102 boolean_t got_is_created
;
103 #if KXLD_USER_OR_OBJECT
104 KXLDArray
*section_order
;
107 boolean_t include_kaslr_relocs
;
110 enum NXByteOrder host_order
;
111 enum NXByteOrder target_order
;
115 /*******************************************************************************
117 *******************************************************************************/
119 static kern_return_t
get_target_machine_info(KXLDObject
*object
,
120 cpu_type_t cputype
, cpu_subtype_t cpusubtype
);
121 static kern_return_t
get_macho_slice_for_arch(KXLDObject
*object
,
122 u_char
*file
, u_long size
);
124 static u_long
get_macho_header_size(const KXLDObject
*object
);
125 static u_long
get_macho_data_size(const KXLDObject
*object
) __unused
;
127 static kern_return_t
init_from_execute(KXLDObject
*object
);
128 static kern_return_t
init_from_final_linked_image(KXLDObject
*object
,
129 u_int
*filetype_out
, struct symtab_command
**symtab_hdr_out
);
131 static boolean_t
target_supports_protected_segments(const KXLDObject
*object
)
132 __attribute__((pure
));
133 static void set_is_object_linked(KXLDObject
*object
);
135 #if KXLD_USER_OR_BUNDLE
136 static boolean_t
target_supports_bundle(const KXLDObject
*object
)
138 static kern_return_t
init_from_bundle(KXLDObject
*object
);
139 static kern_return_t
process_relocs_from_tables(KXLDObject
*object
);
140 static KXLDSeg
*get_seg_by_base_addr(KXLDObject
*object
,
141 kxld_addr_t base_addr
);
142 static kern_return_t
process_symbol_pointers(KXLDObject
*object
);
143 static void add_to_ptr(u_char
*symptr
, kxld_addr_t val
, boolean_t is_32_bit
);
144 #endif /* KXLD_USER_OR_BUNDLE */
146 #if KXLD_USER_OR_OBJECT
147 static boolean_t
target_supports_object(const KXLDObject
*object
)
149 static kern_return_t
init_from_object(KXLDObject
*object
);
150 static kern_return_t
process_relocs_from_sections(KXLDObject
*object
);
151 #endif /* KXLD_USER_OR_OBJECT */
154 static boolean_t
target_supports_slideable_kexts(const KXLDObject
*object
);
155 #endif /* KXLD_PIC_KEXTS */
158 static kern_return_t
export_macho_header(const KXLDObject
*object
, u_char
*buf
,
159 u_int ncmds
, u_long
*header_offset
, u_long header_size
);
160 #if KXLD_USER_OR_ILP32
161 static u_long
get_macho_cmd_data_32(u_char
*file
, u_long offset
,
162 u_int
*filetype
, u_int
*ncmds
);
163 static kern_return_t
export_macho_header_32(const KXLDObject
*object
,
164 u_char
*buf
, u_int ncmds
, u_long
*header_offset
, u_long header_size
);
165 #endif /* KXLD_USER_OR_ILP32 */
166 #if KXLD_USER_OR_LP64
167 static u_long
get_macho_cmd_data_64(u_char
*file
, u_long offset
,
168 u_int
*filetype
, u_int
*ncmds
);
169 static kern_return_t
export_macho_header_64(const KXLDObject
*object
,
170 u_char
*buf
, u_int ncmds
, u_long
*header_offset
, u_long header_size
);
171 #endif /* KXLD_USER_OR_LP64 */
173 #if KXLD_USER_OR_GOT || KXLD_USER_OR_COMMON
174 static kern_return_t
add_section(KXLDObject
*object
, KXLDSect
**sect
);
175 #endif /* KXLD_USER_OR_GOT || KXLD_USER_OR_COMMON */
177 #if KXLD_USER_OR_COMMON
178 static kern_return_t
resolve_common_symbols(KXLDObject
*object
);
179 #endif /* KXLD_USER_OR_COMMON */
182 static boolean_t
target_has_got(const KXLDObject
*object
) __attribute__((pure
));
183 static kern_return_t
create_got(KXLDObject
*object
);
184 static kern_return_t
populate_got(KXLDObject
*object
);
185 #endif /* KXLD_USER_OR_GOT */
187 static KXLDSym
*get_mutable_sym(const KXLDObject
*object
, const KXLDSym
*sym
);
189 static kern_return_t
populate_kmod_info(KXLDObject
*object
);
191 /*******************************************************************************
192 * Prototypes that may need to be exported
193 *******************************************************************************/
194 static boolean_t
kxld_object_target_needs_swap(const KXLDObject
*object __unused
);
195 static KXLDSeg
* kxld_object_get_seg_by_name(const KXLDObject
*object
, const char *segname
);
196 static KXLDSect
* kxld_object_get_sect_by_name(const KXLDObject
*object
, const char *segname
,
197 const char *sectname
);
199 /*******************************************************************************
200 *******************************************************************************/
202 kxld_object_sizeof(void)
204 return sizeof(KXLDObject
);
207 /*******************************************************************************
208 *******************************************************************************/
210 kxld_object_init_from_macho(KXLDObject
*object
, u_char
*file
, u_long size
,
211 const char *name
, KXLDArray
*section_order __unused
,
212 cpu_type_t cputype
, cpu_subtype_t cpusubtype
, KXLDFlags flags __unused
)
214 kern_return_t rval
= KERN_FAILURE
;
215 KXLDSeg
* seg
= NULL
;
225 #if KXLD_USER_OR_OBJECT
226 object
->section_order
= section_order
;
229 object
->include_kaslr_relocs
= ((flags
& kKXLDFlagIncludeRelocs
) == kKXLDFlagIncludeRelocs
);
232 /* Find the local architecture */
234 rval
= get_target_machine_info(object
, cputype
, cpusubtype
);
235 require_noerr(rval
, finish
);
237 /* Find the Mach-O slice for the target architecture */
239 rval
= get_macho_slice_for_arch(object
, file
, size
);
240 require_noerr(rval
, finish
);
242 if (isOldInterface
) {
243 my_file
= object
->file
;
246 my_file
= object
->split_info
.kextExecutable
;
249 /* Allocate the symbol table */
251 if (!object
->symtab
) {
252 object
->symtab
= kxld_alloc(kxld_symtab_sizeof());
253 require_action(object
->symtab
, finish
, rval
=KERN_RESOURCE_SHORTAGE
);
254 bzero(object
->symtab
, kxld_symtab_sizeof());
257 /* Build the relocator */
259 rval
= kxld_relocator_init(&object
->relocator
,
261 object
->symtab
, &object
->sects
,
264 kxld_object_target_needs_swap(object
));
265 require_noerr(rval
, finish
);
267 /* There are four types of Mach-O files that we can support:
268 * 1) 32-bit MH_OBJECT - Snow Leopard and earlier
269 * 2) 32-bit MH_KEXT_BUNDLE - Lion and Later
270 * 3) 64-bit MH_OBJECT - Unsupported
271 * 4) 64-bit MH_KEXT_BUNDLE - Snow Leopard and Later
274 if (kxld_object_is_32_bit(object
)) {
275 struct mach_header
*mach_hdr
= (struct mach_header
*) ((void *) my_file
);
276 object
->filetype
= mach_hdr
->filetype
;
278 struct mach_header_64
*mach_hdr
= (struct mach_header_64
*) ((void *) my_file
);
279 object
->filetype
= mach_hdr
->filetype
;
282 switch (object
->filetype
) {
283 #if KXLD_USER_OR_BUNDLE
285 rval
= init_from_bundle(object
);
286 require_noerr(rval
, finish
);
288 #endif /* KXLD_USER_OR_BUNDLE */
289 #if KXLD_USER_OR_OBJECT
291 rval
= init_from_object(object
);
292 require_noerr(rval
, finish
);
294 #endif /* KXLD_USER_OR_OBJECT */
296 object
->is_kernel
= TRUE
;
297 rval
= init_from_execute(object
);
298 require_noerr(rval
, finish
);
302 kxld_log(kKxldLogLinking
, kKxldLogErr
,
303 kKxldLogFiletypeNotSupported
, object
->filetype
);
307 if (!kxld_object_is_kernel(object
)) {
308 for (i
= 0; i
< object
->segs
.nitems
; ++i
) {
309 seg
= kxld_array_get_item(&object
->segs
, i
);
310 kxld_seg_set_vm_protections(seg
,
311 target_supports_protected_segments(object
));
314 seg
= kxld_object_get_seg_by_name(object
, SEG_LINKEDIT
);
316 (void) kxld_seg_populate_linkedit(seg
, object
->symtab
,
317 kxld_object_is_32_bit(object
)
319 , &object
->locrelocs
, &object
->extrelocs
,
320 target_supports_slideable_kexts(object
)
322 , isOldInterface
? 0 : object
->splitinfolc
.datasize
327 (void) set_is_object_linked(object
);
334 /*******************************************************************************
335 *******************************************************************************/
337 kxld_object_get_link_info(KXLDObject
*object
)
341 return &object
->split_info
;
345 /*******************************************************************************
346 *******************************************************************************/
348 kxld_object_set_link_info(KXLDObject
*object
, splitKextLinkInfo
*link_info
)
353 object
->split_info
.vmaddr_TEXT
= link_info
->vmaddr_TEXT
;
354 object
->split_info
.vmaddr_TEXT_EXEC
= link_info
->vmaddr_TEXT_EXEC
;
355 object
->split_info
.vmaddr_DATA
= link_info
->vmaddr_DATA
;
356 object
->split_info
.vmaddr_DATA_CONST
= link_info
->vmaddr_DATA_CONST
;
357 object
->split_info
.vmaddr_LLVM_COV
= link_info
->vmaddr_LLVM_COV
;
358 object
->split_info
.vmaddr_LINKEDIT
= link_info
->vmaddr_LINKEDIT
;
363 /*******************************************************************************
364 *******************************************************************************/
366 get_target_machine_info(KXLDObject
*object
, cpu_type_t cputype __unused
,
367 cpu_subtype_t cpusubtype __unused
)
371 /* Because the kernel can only link for its own architecture, we know what
372 * the host and target architectures are at compile time, so we can use
373 * a vastly simplified version of this function.
378 #if defined(__x86_64__)
379 object
->cputype
= CPU_TYPE_X86_64
;
380 /* FIXME: we need clang to provide a __x86_64h__ macro for the sub-type. Using
381 * __AVX2__ is a temporary solution until this is available. */
382 #if defined(__AVX2__)
383 object
->cpusubtype
= CPU_SUBTYPE_X86_64_H
;
385 object
->cpusubtype
= CPU_SUBTYPE_X86_64_ALL
;
388 #elif defined(__arm__)
389 object
->cputype
= CPU_TYPE_ARM
;
390 object
->cpusubtype
= CPU_SUBTYPE_ARM_ALL
;
392 #elif defined(__arm64__)
393 object
->cputype
= CPU_TYPE_ARM64
;
394 object
->cpusubtype
= CPU_SUBTYPE_ARM64_ALL
;
397 kxld_log(kKxldLogLinking
, kKxldLogErr
,
398 kKxldLogArchNotSupported
, _mh_execute_header
->cputype
);
399 return KERN_NOT_SUPPORTED
;
400 #endif /* Supported architecture defines */
405 /* User-space must look up the architecture it's running on and the target
406 * architecture at run-time.
409 kern_return_t rval
= KERN_FAILURE
;
410 const NXArchInfo
*host_arch
= NULL
;
414 host_arch
= NXGetLocalArchInfo();
415 require_action(host_arch
, finish
, rval
=KERN_FAILURE
);
417 object
->host_order
= host_arch
->byteorder
;
419 /* If the user did not specify a cputype, use the local architecture.
423 object
->cputype
= cputype
;
424 object
->cpusubtype
= cpusubtype
;
426 object
->cputype
= host_arch
->cputype
;
427 object
->target_order
= object
->host_order
;
429 switch (object
->cputype
) {
431 object
->cpusubtype
= CPU_SUBTYPE_I386_ALL
;
433 case CPU_TYPE_X86_64
:
434 object
->cpusubtype
= CPU_SUBTYPE_X86_64_ALL
;
437 object
->cpusubtype
= CPU_SUBTYPE_ARM_ALL
;
440 object
->cpusubtype
= CPU_SUBTYPE_ARM64_ALL
;
443 object
->cpusubtype
= 0;
448 /* Validate that we support the target architecture and record its
452 switch(object
->cputype
) {
456 case CPU_TYPE_X86_64
:
457 object
->target_order
= NX_LittleEndian
;
460 rval
= KERN_NOT_SUPPORTED
;
461 kxld_log(kKxldLogLinking
, kKxldLogErr
,
462 kKxldLogArchNotSupported
, object
->cputype
);
473 /*******************************************************************************
474 *******************************************************************************/
476 get_macho_slice_for_arch(KXLDObject
*object
, u_char
*file
, u_long size
)
478 kern_return_t rval
= KERN_FAILURE
;
479 struct mach_header
*mach_hdr
= NULL
;
481 struct fat_header
*fat
= (struct fat_header
*) ((void *) file
);
482 struct fat_arch
*archs
= (struct fat_arch
*) &fat
[1];
483 boolean_t swap
= FALSE
;
485 u_char
*my_file
= file
;
486 u_long my_file_size
= size
;
492 /* We are assuming that we will never receive a fat file in the kernel */
495 require_action(size
>= sizeof(*fat
), finish
,
497 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogTruncatedMachO
));
499 /* The fat header is always big endian, so swap if necessary */
500 if (fat
->magic
== FAT_CIGAM
) {
501 (void) swap_fat_header(fat
, object
->host_order
);
505 if (fat
->magic
== FAT_MAGIC
) {
506 struct fat_arch
*arch
= NULL
;
508 boolean_t ovr
= os_mul_and_add_overflow(fat
->nfat_arch
, sizeof(*archs
), sizeof(*fat
), &arch_size
);
510 require_action(!ovr
&& size
>= arch_size
,
513 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogTruncatedMachO
));
515 /* Swap the fat_arch structures if necessary */
517 (void) swap_fat_arch(archs
, fat
->nfat_arch
, object
->host_order
);
520 /* Locate the Mach-O for the requested architecture */
522 arch
= NXFindBestFatArch(object
->cputype
, object
->cpusubtype
, archs
, fat
->nfat_arch
);
523 require_action(arch
, finish
, rval
=KERN_FAILURE
;
524 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogArchNotFound
));
525 require_action(size
>= arch
->offset
+ arch
->size
, finish
,
527 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogTruncatedMachO
));
529 my_file
= my_file
+ arch
->offset
;
530 my_file_size
= arch
->size
;
534 /* Swap the Mach-O's headers to this architecture if necessary */
535 if (kxld_object_is_32_bit(object
)) {
536 rval
= validate_and_swap_macho_32(my_file
, my_file_size
542 rval
= validate_and_swap_macho_64(my_file
, my_file_size
548 require_noerr(rval
, finish
);
550 mach_hdr
= (struct mach_header
*) ((void *) my_file
);
551 require_action(object
->cputype
== mach_hdr
->cputype
, finish
,
553 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogTruncatedMachO
));
554 object
->cpusubtype
= mach_hdr
->cpusubtype
; /* <rdar://problem/16008438> */
556 if (isOldInterface
) {
557 object
->file
= my_file
;
558 object
->size
= my_file_size
;
561 object
->split_info
.kextExecutable
= my_file
;
562 object
->split_info
.kextSize
= my_file_size
;
570 /*******************************************************************************
571 *******************************************************************************/
573 init_from_final_linked_image(KXLDObject
*object
, u_int
*filetype_out
,
574 struct symtab_command
**symtab_hdr_out
)
576 kern_return_t rval
= KERN_FAILURE
;
578 KXLDSect
*sect
= NULL
;
579 struct load_command
*cmd_hdr
= NULL
;
580 struct symtab_command
*symtab_hdr
= NULL
;
581 struct uuid_command
*uuid_hdr
= NULL
;
582 struct version_min_command
*versionmin_hdr
= NULL
;
583 struct build_version_command
*build_version_hdr
= NULL
;
584 struct source_version_command
*source_version_hdr
= NULL
;
585 u_long base_offset
= 0;
587 u_long sect_offset
= 0;
598 if (isOldInterface
) {
599 my_file
= object
->file
;
602 my_file
= object
->split_info
.kextExecutable
;
605 KXLD_3264_FUNC(kxld_object_is_32_bit(object
), base_offset
,
606 get_macho_cmd_data_32
, get_macho_cmd_data_64
,
607 my_file
, offset
, &filetype
, &ncmds
);
609 /* First pass to count segments and sections */
611 offset
= base_offset
;
612 for (i
= 0; i
< ncmds
; ++i
, offset
+= cmd_hdr
->cmdsize
) {
613 cmd_hdr
= (struct load_command
*) ((void *) (my_file
+ offset
));
615 switch(cmd_hdr
->cmd
) {
616 #if KXLD_USER_OR_ILP32
619 struct segment_command
*seg_hdr
=
620 (struct segment_command
*) cmd_hdr
;
622 /* Ignore segments with no vm size */
623 if (!seg_hdr
->vmsize
) continue;
626 nsects
+= seg_hdr
->nsects
;
629 #endif /* KXLD_USER_OR_ILP32 */
630 #if KXLD_USER_OR_LP64
633 struct segment_command_64
*seg_hdr
=
634 (struct segment_command_64
*) ((void *) cmd_hdr
);
636 /* Ignore segments with no vm size */
637 if (!seg_hdr
->vmsize
) continue;
640 nsects
+= seg_hdr
->nsects
;
643 #endif /* KXLD_USER_OR_LP64 */
649 /* Allocate the segments and sections */
652 rval
= kxld_array_init(&object
->segs
, sizeof(KXLDSeg
), nsegs
);
653 require_noerr(rval
, finish
);
655 rval
= kxld_array_init(&object
->sects
, sizeof(KXLDSect
), nsects
);
656 require_noerr(rval
, finish
);
659 /* Initialize the segments and sections */
661 offset
= base_offset
;
662 for (i
= 0; i
< ncmds
; ++i
, offset
+= cmd_hdr
->cmdsize
) {
663 cmd_hdr
= (struct load_command
*) ((void *) (my_file
+ offset
));
666 switch(cmd_hdr
->cmd
) {
667 #if KXLD_USER_OR_ILP32
670 struct segment_command
*seg_hdr
=
671 (struct segment_command
*) cmd_hdr
;
673 /* Ignore segments with no vm size */
674 if (!seg_hdr
->vmsize
) continue;
676 seg
= kxld_array_get_item(&object
->segs
, segi
++);
678 rval
= kxld_seg_init_from_macho_32(seg
, seg_hdr
);
679 require_noerr(rval
, finish
);
681 sect_offset
= offset
+ sizeof(*seg_hdr
);
684 #endif /* KXLD_USER_OR_ILP32 */
685 #if KXLD_USER_OR_LP64
688 struct segment_command_64
*seg_hdr
=
689 (struct segment_command_64
*) ((void *) cmd_hdr
);
691 /* Ignore segments with no vm size */
692 if (!seg_hdr
->vmsize
) continue;
694 seg
= kxld_array_get_item(&object
->segs
, segi
++);
696 rval
= kxld_seg_init_from_macho_64(seg
, seg_hdr
);
697 require_noerr(rval
, finish
);
699 sect_offset
= offset
+ sizeof(*seg_hdr
);
702 #endif /* KXLD_USER_OR_LP64 */
704 symtab_hdr
= (struct symtab_command
*) cmd_hdr
;
707 uuid_hdr
= (struct uuid_command
*) cmd_hdr
;
708 kxld_uuid_init_from_macho(&object
->uuid
, uuid_hdr
);
710 case LC_VERSION_MIN_MACOSX
:
711 case LC_VERSION_MIN_IPHONEOS
:
712 case LC_VERSION_MIN_TVOS
:
713 case LC_VERSION_MIN_WATCHOS
:
714 versionmin_hdr
= (struct version_min_command
*) cmd_hdr
;
715 kxld_versionmin_init_from_macho(&object
->versionmin
, versionmin_hdr
);
717 case LC_BUILD_VERSION
:
718 build_version_hdr
= (struct build_version_command
*)cmd_hdr
;
719 kxld_versionmin_init_from_build_cmd(&object
->versionmin
, build_version_hdr
);
721 case LC_SOURCE_VERSION
:
722 source_version_hdr
= (struct source_version_command
*) (void *) cmd_hdr
;
723 kxld_srcversion_init_from_macho(&object
->srcversion
, source_version_hdr
);
726 object
->dysymtab_hdr
= (struct dysymtab_command
*) cmd_hdr
;
727 rval
= kxld_reloc_create_macho(&object
->extrelocs
, &object
->relocator
,
728 (struct relocation_info
*) ((void *) (my_file
+ object
->dysymtab_hdr
->extreloff
)),
729 object
->dysymtab_hdr
->nextrel
);
730 require_noerr(rval
, finish
);
732 rval
= kxld_reloc_create_macho(&object
->locrelocs
, &object
->relocator
,
733 (struct relocation_info
*) ((void *) (my_file
+ object
->dysymtab_hdr
->locreloff
)),
734 object
->dysymtab_hdr
->nlocrel
);
735 require_noerr(rval
, finish
);
740 /* Don't need to do anything with UNIXTHREAD or MAIN for the kernel */
741 require_action(kxld_object_is_kernel(object
),
742 finish
, rval
=KERN_FAILURE
;
743 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
744 "LC_UNIXTHREAD/LC_MAIN segment is not valid in a kext."));
746 case LC_SEGMENT_SPLIT_INFO
:
748 struct linkedit_data_command
*split_info_hdr
= NULL
;
749 split_info_hdr
= (struct linkedit_data_command
*) (void *) cmd_hdr
;
750 kxld_splitinfolc_init_from_macho(&object
->splitinfolc
, split_info_hdr
);
754 /* binary blob of data */
756 case LC_CODE_SIGNATURE
:
758 case LC_DYLD_INFO_ONLY
:
759 case LC_FUNCTION_STARTS
:
760 case LC_DATA_IN_CODE
:
761 case LC_DYLIB_CODE_SIGN_DRS
:
762 /* Various metadata that might be stored in the linkedit segment */
766 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
767 "Invalid load command type in MH_KEXT_BUNDLE kext: %u.", cmd_hdr
->cmd
);
773 /* Initialize the sections */
774 for (j
= 0; j
< seg
->sects
.nitems
; ++j
, ++secti
) {
775 sect
= kxld_array_get_item(&object
->sects
, secti
);
777 KXLD_3264_FUNC(kxld_object_is_32_bit(object
), rval
,
778 kxld_sect_init_from_macho_32
, kxld_sect_init_from_macho_64
,
779 sect
, my_file
, §_offset
, secti
, &object
->relocator
);
780 require_noerr(rval
, finish
);
782 /* Add the section to the segment. This will also make sure
783 * that the sections and segments have the same segname.
785 rval
= kxld_seg_add_section(seg
, sect
);
786 require_noerr(rval
, finish
);
788 rval
= kxld_seg_finish_init(seg
);
789 require_noerr(rval
, finish
);
793 if (filetype_out
) *filetype_out
= filetype
;
794 if (symtab_hdr_out
) *symtab_hdr_out
= symtab_hdr
;
795 object
->is_final_image
= TRUE
;
801 /*******************************************************************************
802 *******************************************************************************/
804 init_from_execute(KXLDObject
*object
)
806 kern_return_t rval
= KERN_FAILURE
;
807 struct symtab_command
*symtab_hdr
= NULL
;
809 KXLDSeg
* kernel_linkedit_seg
= NULL
; // used if running kernel
810 #if KXLD_USER_OR_OBJECT
812 KXLDSect
*sect
= NULL
;
813 KXLDSectionName
*sname
= NULL
;
814 u_int i
= 0, j
= 0, k
= 0;
815 #endif /* KXLD_USER_OR_OBJECT */
820 if (isOldInterface
) {
821 my_file
= object
->file
;
824 my_file
= object
->split_info
.kextExecutable
;
827 require_action(kxld_object_is_kernel(object
), finish
, rval
=KERN_FAILURE
);
829 rval
= init_from_final_linked_image(object
, &filetype
, &symtab_hdr
);
830 require_noerr(rval
, finish
);
832 require_action(filetype
== MH_EXECUTE
, finish
, rval
=KERN_FAILURE
;
833 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
834 "The kernel file is not of type MH_EXECUTE."));
836 /* Initialize the symbol table. If this is the running kernel
837 * we will work from the in-memory linkedit segment;
838 * otherwise we work from the whole mach-o image.
841 kernel_linkedit_seg
= kxld_object_get_seg_by_name(object
, SEG_LINKEDIT
);
842 require_action(kernel_linkedit_seg
, finish
, rval
=KERN_FAILURE
;
843 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
));
846 KXLD_3264_FUNC(kxld_object_is_32_bit(object
), rval
,
847 kxld_symtab_init_from_macho_32
, kxld_symtab_init_from_macho_64
,
848 object
->symtab
, symtab_hdr
, my_file
, kernel_linkedit_seg
);
849 require_noerr(rval
, finish
);
851 #if KXLD_USER_OR_OBJECT
852 /* Save off the order of section names so that we can lay out kext
853 * sections for MH_OBJECT-based systems.
855 if (target_supports_object(object
)) {
857 rval
= kxld_array_init(object
->section_order
, sizeof(KXLDSectionName
),
858 object
->sects
.nitems
);
859 require_noerr(rval
, finish
);
861 /* Copy the section names into the section_order array for future kext
864 for (i
= 0, k
= 0; i
< object
->segs
.nitems
; ++i
) {
865 seg
= kxld_array_get_item(&object
->segs
, i
);
867 for (j
= 0; j
< seg
->sects
.nitems
; ++j
, ++k
) {
868 sect
= *(KXLDSect
**) kxld_array_get_item(&seg
->sects
, j
);
869 sname
= kxld_array_get_item(object
->section_order
, k
);
871 strlcpy(sname
->segname
, sect
->segname
, sizeof(sname
->segname
));
872 strlcpy(sname
->sectname
, sect
->sectname
, sizeof(sname
->sectname
));
876 #endif /* KXLD_USER_OR_OBJECT */
883 #if KXLD_USER_OR_BUNDLE
884 /*******************************************************************************
885 *******************************************************************************/
887 target_supports_bundle(const KXLDObject
*object __unused
)
892 /*******************************************************************************
893 *******************************************************************************/
895 init_from_bundle(KXLDObject
*object
)
897 kern_return_t rval
= KERN_FAILURE
;
898 struct symtab_command
*symtab_hdr
= NULL
;
904 if (isOldInterface
) {
905 my_file
= object
->file
;
908 my_file
= object
->split_info
.kextExecutable
;
911 require_action(target_supports_bundle(object
), finish
,
913 kxld_log(kKxldLogLinking
, kKxldLogErr
,
914 kKxldLogFiletypeNotSupported
, MH_KEXT_BUNDLE
));
916 rval
= init_from_final_linked_image(object
, &filetype
, &symtab_hdr
);
917 require_noerr(rval
, finish
);
919 require_action(filetype
== MH_KEXT_BUNDLE
, finish
,
922 KXLD_3264_FUNC(kxld_object_is_32_bit(object
), rval
,
923 kxld_symtab_init_from_macho_32
, kxld_symtab_init_from_macho_64
,
924 object
->symtab
, symtab_hdr
, my_file
,
925 /* kernel_linkedit_seg */ NULL
);
926 require_noerr(rval
, finish
);
932 #endif /* KXLD_USER_OR_BUNDLE */
934 #if KXLD_USER_OR_OBJECT
935 /*******************************************************************************
936 *******************************************************************************/
937 static boolean_t
target_supports_object(const KXLDObject
*object
)
939 return (object
->cputype
== CPU_TYPE_I386
);
942 /*******************************************************************************
943 *******************************************************************************/
945 init_from_object(KXLDObject
*object
)
947 kern_return_t rval
= KERN_FAILURE
;
948 struct load_command
*cmd_hdr
= NULL
;
949 struct symtab_command
*symtab_hdr
= NULL
;
950 struct uuid_command
*uuid_hdr
= NULL
;
951 KXLDSect
*sect
= NULL
;
953 u_long sect_offset
= 0;
958 boolean_t has_segment
= FALSE
;
963 if (isOldInterface
) {
964 my_file
= object
->file
;
967 my_file
= object
->split_info
.kextExecutable
;
970 require_action(target_supports_object(object
),
971 finish
, rval
=KERN_FAILURE
;
972 kxld_log(kKxldLogLinking
, kKxldLogErr
,
973 kKxldLogFiletypeNotSupported
, MH_OBJECT
));
975 KXLD_3264_FUNC(kxld_object_is_32_bit(object
), offset
,
976 get_macho_cmd_data_32
, get_macho_cmd_data_64
,
977 my_file
, offset
, &filetype
, &ncmds
);
979 require_action(filetype
== MH_OBJECT
, finish
, rval
=KERN_FAILURE
);
981 /* MH_OBJECTs use one unnamed segment to contain all of the sections. We
982 * loop over all of the load commands to initialize the structures we
983 * expect. Then, we'll use the unnamed segment to get to all of the
984 * sections, and then use those sections to create the actual segments.
987 for (; i
< ncmds
; ++i
, offset
+= cmd_hdr
->cmdsize
) {
988 cmd_hdr
= (struct load_command
*) ((void *) (my_file
+ offset
));
990 switch(cmd_hdr
->cmd
) {
991 #if KXLD_USER_OR_ILP32
994 struct segment_command
*seg_hdr
=
995 (struct segment_command
*) cmd_hdr
;
997 /* Ignore segments with no vm size */
998 if (!seg_hdr
->vmsize
) continue;
1000 /* Ignore LINKEDIT segments */
1001 if (streq_safe(seg_hdr
->segname
, SEG_LINKEDIT
,
1002 const_strlen(SEG_LINKEDIT
)))
1007 require_action(kxld_object_is_32_bit(object
), finish
, rval
=KERN_FAILURE
;
1008 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
1009 "LC_SEGMENT in 64-bit kext."));
1010 require_action(!has_segment
, finish
, rval
=KERN_FAILURE
;
1011 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
1012 "Multiple segments in an MH_OBJECT kext."));
1014 nsects
= seg_hdr
->nsects
;
1015 sect_offset
= offset
+ sizeof(*seg_hdr
);
1019 #endif /* KXLD_USER_OR_ILP32 */
1020 #if KXLD_USER_OR_LP64
1023 struct segment_command_64
*seg_hdr
=
1024 (struct segment_command_64
*) ((void *) cmd_hdr
);
1026 /* Ignore segments with no vm size */
1027 if (!seg_hdr
->vmsize
) continue;
1029 /* Ignore LINKEDIT segments */
1030 if (streq_safe(seg_hdr
->segname
, SEG_LINKEDIT
,
1031 const_strlen(SEG_LINKEDIT
)))
1036 require_action(!kxld_object_is_32_bit(object
), finish
, rval
=KERN_FAILURE
;
1037 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
1038 "LC_SEGMENT_64 in a 32-bit kext."));
1039 require_action(!has_segment
, finish
, rval
=KERN_FAILURE
;
1040 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
1041 "Multiple segments in an MH_OBJECT kext."));
1043 nsects
= seg_hdr
->nsects
;
1044 sect_offset
= offset
+ sizeof(*seg_hdr
);
1048 #endif /* KXLD_USER_OR_LP64 */
1050 symtab_hdr
= (struct symtab_command
*) cmd_hdr
;
1052 KXLD_3264_FUNC(kxld_object_is_32_bit(object
), rval
,
1053 kxld_symtab_init_from_macho_32
, kxld_symtab_init_from_macho_64
,
1054 object
->symtab
, symtab_hdr
, my_file
,
1055 /* kernel_linkedit_seg */ NULL
);
1056 require_noerr(rval
, finish
);
1059 uuid_hdr
= (struct uuid_command
*) cmd_hdr
;
1060 kxld_uuid_init_from_macho(&object
->uuid
, uuid_hdr
);
1064 /* Don't need to do anything with UNIXTHREAD or MAIN */
1066 case LC_CODE_SIGNATURE
:
1068 case LC_DYLD_INFO_ONLY
:
1069 case LC_FUNCTION_STARTS
:
1070 case LC_DATA_IN_CODE
:
1071 case LC_DYLIB_CODE_SIGN_DRS
:
1072 /* Various metadata that might be stored in the linkedit segment */
1075 /* bag-of-bits carried with the binary: ignore */
1077 case LC_BUILD_VERSION
:
1078 /* should be able to ignore build version commands */
1079 kxld_log(kKxldLogLinking
, kKxldLogWarn
,
1080 "Ignoring LC_BUILD_VERSION (%u) in MH_OBJECT kext: (platform:%d)",
1081 cmd_hdr
->cmd
, ((struct build_version_command
*)cmd_hdr
)->platform
);
1083 case LC_VERSION_MIN_MACOSX
:
1084 case LC_VERSION_MIN_IPHONEOS
:
1085 case LC_VERSION_MIN_TVOS
:
1086 case LC_VERSION_MIN_WATCHOS
:
1087 case LC_SOURCE_VERSION
:
1088 /* Not supported for object files, fall through */
1090 rval
= KERN_FAILURE
;
1091 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
1092 "Invalid load command type in MH_OBJECT kext: %u.", cmd_hdr
->cmd
);
1099 /* Get the number of sections from the segment and build the section index */
1101 rval
= kxld_array_init(&object
->sects
, sizeof(KXLDSect
), nsects
);
1102 require_noerr(rval
, finish
);
1104 /* Loop over all of the sections to initialize the section index */
1106 for (i
= 0; i
< nsects
; ++i
) {
1107 sect
= kxld_array_get_item(&object
->sects
, i
);
1109 KXLD_3264_FUNC(kxld_object_is_32_bit(object
), rval
,
1110 kxld_sect_init_from_macho_32
, kxld_sect_init_from_macho_64
,
1111 sect
, my_file
, §_offset
, i
, &object
->relocator
);
1112 require_noerr(rval
, finish
);
1115 /* Create special sections */
1117 #if KXLD_USER_OR_GOT
1118 rval
= create_got(object
);
1119 require_noerr(rval
, finish
);
1120 #endif /* KXLD_USER_OR_GOT */
1122 #if KXLD_USER_OR_COMMON
1123 rval
= resolve_common_symbols(object
);
1124 require_noerr(rval
, finish
);
1125 #endif /* KXLD_USER_OR_COMMON */
1127 /* Create the segments from the section index */
1129 rval
= kxld_seg_create_seg_from_sections(&object
->segs
, &object
->sects
);
1130 require_noerr(rval
, finish
);
1132 rval
= kxld_seg_finalize_object_segment(&object
->segs
,
1133 object
->section_order
, get_macho_header_size(object
));
1134 require_noerr(rval
, finish
);
1136 rval
= kxld_seg_init_linkedit(&object
->segs
);
1137 require_noerr(rval
, finish
);
1140 rval
= KERN_SUCCESS
;
1144 #endif /* KXLD_USER_OR_OBJECT */
1146 #if KXLD_USER_OR_ILP32
1147 /*******************************************************************************
1148 *******************************************************************************/
1150 get_macho_cmd_data_32(u_char
*file
, u_long offset
, u_int
*filetype
, u_int
*ncmds
)
1152 struct mach_header
*mach_hdr
= (struct mach_header
*) ((void *) (file
+ offset
));
1154 if (filetype
) *filetype
= mach_hdr
->filetype
;
1155 if (ncmds
) *ncmds
= mach_hdr
->ncmds
;
1157 return sizeof(*mach_hdr
);
1160 #endif /* KXLD_USER_OR_ILP32 */
1162 #if KXLD_USER_OR_LP64
1163 /*******************************************************************************
1164 *******************************************************************************/
1166 get_macho_cmd_data_64(u_char
*file
, u_long offset
, u_int
*filetype
, u_int
*ncmds
)
1168 struct mach_header_64
*mach_hdr
= (struct mach_header_64
*) ((void *) (file
+ offset
));
1170 if (filetype
) *filetype
= mach_hdr
->filetype
;
1171 if (ncmds
) *ncmds
= mach_hdr
->ncmds
;
1173 return sizeof(*mach_hdr
);
1175 #endif /* KXLD_USER_OR_LP64 */
1177 /*******************************************************************************
1178 *******************************************************************************/
1180 get_macho_header_size(const KXLDObject
*object
)
1182 KXLDSeg
*seg
= NULL
;
1183 u_long header_size
= 0;
1185 boolean_t object_is_32_bit
= kxld_object_is_32_bit(object
);
1189 /* Mach, segment, symtab, and UUID headers */
1191 header_size
+= object_is_32_bit
? sizeof(struct mach_header
) : sizeof(struct mach_header_64
);
1193 for (i
= 0; i
< object
->segs
.nitems
; ++i
) {
1194 seg
= kxld_array_get_item(&object
->segs
, i
);
1195 header_size
+= kxld_seg_get_macho_header_size(seg
, object_is_32_bit
);
1198 header_size
+= kxld_symtab_get_macho_header_size();
1201 if (target_supports_slideable_kexts(object
)) {
1202 header_size
+= kxld_reloc_get_macho_header_size();
1204 #endif /* KXLD_PIC_KEXTS */
1206 if (object
->uuid
.has_uuid
) {
1207 header_size
+= kxld_uuid_get_macho_header_size();
1210 if (object
->versionmin
.has_versionmin
) {
1211 header_size
+= kxld_versionmin_get_macho_header_size(&object
->versionmin
);
1214 if (object
->srcversion
.has_srcversion
) {
1215 header_size
+= kxld_srcversion_get_macho_header_size();
1218 if (isSplitKext
&& object
->splitinfolc
.has_splitinfolc
) {
1219 header_size
+= kxld_splitinfolc_get_macho_header_size();
1225 /*******************************************************************************
1226 *******************************************************************************/
1228 get_macho_data_size(const KXLDObject
*object
)
1230 KXLDSeg
*seg
= NULL
;
1231 u_long data_size
= 0;
1236 /* total all segment vmsize values */
1237 for (i
= 0; i
< object
->segs
.nitems
; ++i
) {
1238 seg
= kxld_array_get_item(&object
->segs
, i
);
1239 data_size
+= (u_long
) kxld_seg_get_vmsize(seg
);
1244 /* ensure that when we eventually emit the final linked object,
1245 * appending the __DYSYMTAB data after the __LINKEDIT data will
1246 * not overflow the space allocated for the __LINKEDIT segment
1249 u_long seg_vmsize
= 0;
1250 u_long symtab_size
= 0;
1251 u_long reloc_size
= 0;
1253 /* get current __LINKEDIT sizes */
1254 seg
= kxld_object_get_seg_by_name(object
, SEG_LINKEDIT
);
1256 seg_vmsize
= (u_long
) kxld_seg_get_vmsize(seg
);
1258 /* get size of symbol table data that will eventually be dumped
1259 * into the __LINKEDIT segment
1261 symtab_size
= kxld_symtab_get_macho_data_size(object
->symtab
, kxld_object_is_32_bit(object
));
1263 if (target_supports_slideable_kexts(object
)) {
1264 /* get size of __DYSYMTAB relocation entries */
1265 reloc_size
= kxld_reloc_get_macho_data_size(&object
->locrelocs
, &object
->extrelocs
);
1268 /* combine, and ensure they'll both fit within the page(s)
1269 * allocated for the __LINKEDIT segment. If they'd overflow,
1270 * increase the vmsize appropriately so no overflow will occur
1272 if ((symtab_size
+ reloc_size
) > seg_vmsize
) {
1273 u_long overflow
= (symtab_size
+ reloc_size
) - seg_vmsize
;
1274 data_size
+= kxld_round_page_cross_safe(overflow
);
1277 #endif // KXLD_PIC_KEXTS
1282 /*******************************************************************************
1283 *******************************************************************************/
1285 kxld_object_target_needs_swap(const KXLDObject
*object __unused
)
1290 return (object
->target_order
!= object
->host_order
);
1294 /*******************************************************************************
1295 *******************************************************************************/
1297 kxld_object_get_seg_by_name(const KXLDObject
*object
, const char *segname
)
1299 KXLDSeg
*seg
= NULL
;
1302 for (i
= 0; i
< object
->segs
.nitems
; ++i
) {
1303 seg
= kxld_array_get_item(&object
->segs
, i
);
1305 if (streq_safe(segname
, seg
->segname
, sizeof(seg
->segname
))) break;
1313 /*******************************************************************************
1314 *******************************************************************************/
1315 const KXLDRelocator
*
1316 kxld_object_get_relocator(const KXLDObject
* object
)
1320 return &object
->relocator
;
1323 /*******************************************************************************
1324 *******************************************************************************/
1326 kxld_object_get_sect_by_name(const KXLDObject
*object
, const char *segname
,
1327 const char *sectname
)
1329 KXLDSect
*sect
= NULL
;
1332 for (i
= 0; i
< object
->sects
.nitems
; ++i
) {
1333 sect
= kxld_array_get_item(&object
->sects
, i
);
1335 if (streq_safe(segname
, sect
->segname
, sizeof(sect
->segname
)) &&
1336 streq_safe(sectname
, sect
->sectname
, sizeof(sect
->sectname
)))
1347 /*******************************************************************************
1348 *******************************************************************************/
1350 kxld_object_get_reloc_at_symbol(const KXLDObject
*object
, const KXLDSym
*sym
)
1352 const KXLDReloc
*reloc
= NULL
;
1353 const KXLDSect
*sect
= NULL
;
1354 uint32_t offset
= 0;
1359 sect
= kxld_object_get_section_by_index(object
, sym
->sectnum
);
1360 require(sect
, finish
);
1362 if (kxld_object_is_final_image(object
)) {
1363 reloc
= kxld_reloc_get_reloc_by_offset(&object
->extrelocs
,
1366 reloc
= kxld_reloc_get_reloc_by_offset(&object
->locrelocs
,
1370 offset
= kxld_sym_get_section_offset(sym
, sect
);
1371 reloc
= kxld_reloc_get_reloc_by_offset(§
->relocs
, offset
);
1378 /*******************************************************************************
1379 *******************************************************************************/
1381 kxld_object_get_symbol_of_reloc(const KXLDObject
*object
,
1382 const KXLDReloc
*reloc
, const KXLDSect
*sect
)
1384 const KXLDSym
*sym
= NULL
;
1387 if (isOldInterface
) {
1388 my_file
= object
->file
;
1391 my_file
= object
->split_info
.kextExecutable
;
1394 if (kxld_object_is_final_image(object
)) {
1395 sym
= kxld_reloc_get_symbol(&object
->relocator
, reloc
, my_file
);
1397 sym
= kxld_reloc_get_symbol(&object
->relocator
, reloc
, sect
->data
);
1402 /*******************************************************************************
1403 *******************************************************************************/
1405 kxld_object_get_section_by_index(const KXLDObject
*object
, u_int sectnum
)
1407 KXLDSect
*sect
= NULL
;
1411 if (sectnum
< object
->sects
.nitems
) {
1412 sect
= kxld_array_get_item(&object
->sects
, sectnum
);
1418 /*******************************************************************************
1419 *******************************************************************************/
1421 kxld_object_get_extrelocs(const KXLDObject
*object
)
1423 const KXLDArray
*rval
= NULL
;
1427 if (kxld_object_is_final_image(object
)) {
1428 rval
= &object
->extrelocs
;
1434 /*******************************************************************************
1435 *******************************************************************************/
1437 kxld_object_get_symtab(const KXLDObject
*object
)
1441 return object
->symtab
;
1444 #if KXLD_USER_OR_GOT || KXLD_USER_OR_COMMON
1445 /*******************************************************************************
1446 *******************************************************************************/
1447 static kern_return_t
1448 add_section(KXLDObject
*object
, KXLDSect
**sect
)
1450 kern_return_t rval
= KERN_FAILURE
;
1451 u_int nsects
= object
->sects
.nitems
;
1453 rval
= kxld_array_resize(&object
->sects
, nsects
+ 1);
1454 require_noerr(rval
, finish
);
1456 *sect
= kxld_array_get_item(&object
->sects
, nsects
);
1458 rval
= KERN_SUCCESS
;
1463 #endif /* KXLD_USER_OR_GOT || KXLD_USER_OR_COMMON */
1465 #if KXLD_USER_OR_COMMON
1466 /*******************************************************************************
1467 * If there are common symbols, calculate how much space they'll need
1468 * and create/grow the __DATA __common section to accommodate them.
1469 * Then, resolve them against that section.
1470 *******************************************************************************/
1471 static kern_return_t
1472 resolve_common_symbols(KXLDObject
*object
)
1474 kern_return_t rval
= KERN_FAILURE
;
1475 KXLDSymtabIterator iter
;
1476 KXLDSym
*sym
= NULL
;
1477 KXLDSect
*sect
= NULL
;
1478 kxld_addr_t base_addr
= 0;
1479 kxld_size_t size
= 0;
1480 kxld_size_t total_size
= 0;
1482 u_int max_align
= 0;
1485 if (!kxld_object_target_supports_common_symbols(object
)) {
1486 rval
= KERN_SUCCESS
;
1490 /* Iterate over the common symbols to calculate their total aligned size */
1491 kxld_symtab_iterator_init(&iter
, object
->symtab
, kxld_sym_is_common
, FALSE
);
1492 while ((sym
= kxld_symtab_iterator_get_next(&iter
))) {
1493 align
= kxld_sym_get_common_align(sym
);
1494 size
= kxld_sym_get_common_size(sym
);
1496 if (align
> max_align
) max_align
= align
;
1498 total_size
= kxld_align_address(total_size
, align
) + size
;
1501 /* If there are common symbols, grow or create the __DATA __common section
1505 sect
= kxld_object_get_sect_by_name(object
, SEG_DATA
, SECT_COMMON
);
1507 base_addr
= sect
->base_addr
+ sect
->size
;
1509 kxld_sect_grow(sect
, total_size
, max_align
);
1513 rval
= add_section(object
, §
);
1514 require_noerr(rval
, finish
);
1516 kxld_sect_init_zerofill(sect
, SEG_DATA
, SECT_COMMON
,
1517 total_size
, max_align
);
1520 /* Resolve the common symbols against the new section */
1521 rval
= kxld_array_get_index(&object
->sects
, sect
, §num
);
1522 require_noerr(rval
, finish
);
1524 kxld_symtab_iterator_reset(&iter
);
1525 while ((sym
= kxld_symtab_iterator_get_next(&iter
))) {
1526 align
= kxld_sym_get_common_align(sym
);
1527 size
= kxld_sym_get_common_size(sym
);
1529 base_addr
= kxld_align_address(base_addr
, align
);
1530 kxld_sym_resolve_common(sym
, sectnum
, base_addr
);
1536 rval
= KERN_SUCCESS
;
1541 #endif /* KXLD_USER_OR_COMMON */
1543 #if KXLD_USER_OR_GOT
1544 /*******************************************************************************
1545 *******************************************************************************/
1547 target_has_got(const KXLDObject
*object
)
1552 /*******************************************************************************
1553 * Create and initialize the Global Offset Table
1554 *******************************************************************************/
1555 static kern_return_t
1556 create_got(KXLDObject
*object
)
1558 kern_return_t rval
= KERN_FAILURE
;
1559 KXLDSect
*sect
= NULL
;
1563 if (!target_has_got(object
)) {
1564 rval
= KERN_SUCCESS
;
1568 for (i
= 0; i
< object
->sects
.nitems
; ++i
) {
1569 sect
= kxld_array_get_item(&object
->sects
, i
);
1570 ngots
+= kxld_sect_get_ngots(sect
, &object
->relocator
,
1574 rval
= add_section(object
, §
);
1575 require_noerr(rval
, finish
);
1577 rval
= kxld_sect_init_got(sect
, ngots
);
1578 require_noerr(rval
, finish
);
1580 object
->got_is_created
= TRUE
;
1581 rval
= KERN_SUCCESS
;
1587 /*******************************************************************************
1588 *******************************************************************************/
1589 static kern_return_t
1590 populate_got(KXLDObject
*object
)
1592 kern_return_t rval
= KERN_FAILURE
;
1593 KXLDSect
*sect
= NULL
;
1596 if (!target_has_got(object
) || !object
->got_is_created
) {
1597 rval
= KERN_SUCCESS
;
1601 for (i
= 0; i
< object
->sects
.nitems
; ++i
) {
1602 sect
= kxld_array_get_item(&object
->sects
, i
);
1603 if (streq_safe(sect
->segname
, KXLD_SEG_GOT
, sizeof(KXLD_SEG_GOT
)) &&
1604 streq_safe(sect
->sectname
, KXLD_SECT_GOT
, sizeof(KXLD_SECT_GOT
)))
1606 kxld_sect_populate_got(sect
, object
->symtab
,
1607 kxld_object_target_needs_swap(object
));
1612 require_action(i
< object
->sects
.nitems
, finish
, rval
=KXLD_MISSING_GOT
);
1614 rval
= KERN_SUCCESS
;
1619 #endif /* KXLD_USER_OR_GOT */
1621 /*******************************************************************************
1622 *******************************************************************************/
1624 target_supports_protected_segments(const KXLDObject
*object
)
1626 return (object
->is_final_image
&&
1627 (object
->cputype
== CPU_TYPE_X86_64
||
1628 object
->cputype
== CPU_TYPE_ARM
||
1629 object
->cputype
== CPU_TYPE_ARM64
));
1632 /*******************************************************************************
1633 *******************************************************************************/
1635 set_is_object_linked(KXLDObject
*object
)
1639 if (kxld_object_is_kernel(object
)) {
1640 object
->is_linked
= TRUE
;
1644 if (object
->is_final_image
) {
1645 object
->is_linked
= !object
->extrelocs
.nitems
;
1649 object
->is_linked
= TRUE
;
1650 for (i
= 0; i
< object
->sects
.nitems
; ++i
) {
1651 KXLDSect
*sect
= kxld_array_get_item(&object
->sects
, i
);
1652 if (sect
->relocs
.nitems
) {
1653 object
->is_linked
= FALSE
;
1660 /*******************************************************************************
1661 *******************************************************************************/
1662 void kxld_object_clear(KXLDObject
*object
)
1664 KXLDSeg
*seg
= NULL
;
1665 KXLDSect
*sect
= NULL
;
1671 if (isOldInterface
) {
1672 my_file
= object
->file
;
1675 my_file
= object
->split_info
.kextExecutable
;
1679 if (kxld_object_is_kernel(object
)) {
1680 unswap_macho(my_file
, object
->host_order
, object
->target_order
);
1682 #endif /* !KERNEL */
1684 for (i
= 0; i
< object
->segs
.nitems
; ++i
) {
1685 seg
= kxld_array_get_item(&object
->segs
, i
);
1686 kxld_seg_clear(seg
);
1688 kxld_array_reset(&object
->segs
);
1690 for (i
= 0; i
< object
->sects
.nitems
; ++i
) {
1691 sect
= kxld_array_get_item(&object
->sects
, i
);
1692 kxld_sect_clear(sect
);
1694 kxld_array_reset(&object
->sects
);
1696 kxld_array_reset(&object
->extrelocs
);
1697 kxld_array_reset(&object
->locrelocs
);
1698 kxld_relocator_clear(&object
->relocator
);
1699 kxld_uuid_clear(&object
->uuid
);
1700 kxld_versionmin_clear(&object
->versionmin
);
1701 kxld_srcversion_clear(&object
->srcversion
);
1703 if (object
->symtab
) kxld_symtab_clear(object
->symtab
);
1705 if (isOldInterface
) {
1706 object
->file
= NULL
;
1710 kxld_splitinfolc_clear(&object
->splitinfolc
);
1711 object
->split_info
.kextExecutable
= NULL
;
1712 object
->split_info
.kextSize
= 0;
1714 object
->filetype
= 0;
1715 object
->cputype
= 0;
1716 object
->cpusubtype
= 0;
1717 object
->is_kernel
= FALSE
;
1718 object
->is_final_image
= FALSE
;
1719 object
->is_linked
= FALSE
;
1720 object
->got_is_created
= FALSE
;
1722 #if KXLD_USER_OR_OBJECT
1723 object
->section_order
= NULL
;
1726 object
->host_order
= 0;
1727 object
->target_order
= 0;
1731 /*******************************************************************************
1732 *******************************************************************************/
1733 void kxld_object_deinit(KXLDObject
*object __unused
)
1735 KXLDSeg
*seg
= NULL
;
1736 KXLDSect
*sect
= NULL
;
1742 if (isOldInterface
) {
1743 my_file
= object
->file
;
1746 my_file
= object
->split_info
.kextExecutable
;
1750 if (my_file
&& kxld_object_is_kernel(object
)) {
1751 unswap_macho(my_file
, object
->host_order
, object
->target_order
);
1753 #endif /* !KERNEL */
1755 for (i
= 0; i
< object
->segs
.maxitems
; ++i
) {
1756 seg
= kxld_array_get_slot(&object
->segs
, i
);
1757 kxld_seg_deinit(seg
);
1759 kxld_array_deinit(&object
->segs
);
1761 for (i
= 0; i
< object
->sects
.maxitems
; ++i
) {
1762 sect
= kxld_array_get_slot(&object
->sects
, i
);
1763 kxld_sect_deinit(sect
);
1765 kxld_array_deinit(&object
->sects
);
1767 kxld_array_deinit(&object
->extrelocs
);
1768 kxld_array_deinit(&object
->locrelocs
);
1770 if (object
->symtab
) {
1771 kxld_symtab_deinit(object
->symtab
);
1772 kxld_free(object
->symtab
, kxld_symtab_sizeof());
1775 bzero(object
, sizeof(*object
));
1778 /*******************************************************************************
1779 *******************************************************************************/
1781 kxld_object_get_file(const KXLDObject
*object
)
1783 const u_char
*my_file
;
1787 if (isOldInterface
) {
1788 my_file
= object
->file
;
1791 my_file
= object
->split_info
.kextExecutable
;
1797 /*******************************************************************************
1798 *******************************************************************************/
1800 kxld_object_get_name(const KXLDObject
*object
)
1804 return object
->name
;
1807 /*******************************************************************************
1808 *******************************************************************************/
1810 kxld_object_is_32_bit(const KXLDObject
*object
)
1814 return kxld_is_32_bit(object
->cputype
);
1817 /*******************************************************************************
1818 *******************************************************************************/
1820 kxld_object_is_final_image(const KXLDObject
*object
)
1824 return object
->is_final_image
;
1827 /*******************************************************************************
1828 *******************************************************************************/
1830 kxld_object_is_kernel(const KXLDObject
*object
)
1834 return object
->is_kernel
;
1837 /*******************************************************************************
1838 *******************************************************************************/
1840 kxld_object_is_linked(const KXLDObject
*object
)
1844 return object
->is_linked
;
1847 /*******************************************************************************
1848 *******************************************************************************/
1850 kxld_object_target_supports_strict_patching(const KXLDObject
*object
)
1854 return (object
->cputype
!= CPU_TYPE_I386
);
1857 /*******************************************************************************
1858 *******************************************************************************/
1860 kxld_object_target_supports_common_symbols(const KXLDObject
*object
)
1864 return (object
->cputype
== CPU_TYPE_I386
);
1868 /*******************************************************************************
1869 *******************************************************************************/
1871 kxld_object_get_vmsize_for_seg_by_name(const KXLDObject
*object
,
1872 const char *segname
,
1879 KXLDSeg
*seg
= NULL
;
1882 /* segment vmsize */
1883 seg
= kxld_object_get_seg_by_name(object
, segname
);
1885 my_size
= (u_long
) kxld_seg_get_vmsize(seg
);
1888 if (kxld_seg_is_linkedit_seg(seg
))
1890 u_long reloc_size
= 0;
1892 if (target_supports_slideable_kexts(object
)) {
1893 /* get size of __DYSYMTAB relocation entries */
1894 reloc_size
= kxld_reloc_get_macho_data_size(&object
->locrelocs
, &object
->extrelocs
);
1895 my_size
+= reloc_size
;
1903 /*******************************************************************************
1904 *******************************************************************************/
1906 kxld_object_get_vmsize(const KXLDObject
*object
, u_long
*header_size
,
1915 /* vmsize is the padded header page(s) + segment vmsizes */
1917 *header_size
= (object
->is_final_image
) ?
1918 0 : (u_long
)kxld_round_page_cross_safe(get_macho_header_size(object
));
1920 *vmsize
= *header_size
+ get_macho_data_size(object
);
1924 /*******************************************************************************
1925 *******************************************************************************/
1927 kxld_object_set_linked_object_size(KXLDObject
*object
, u_long vmsize
)
1931 if (isOldInterface
) {
1932 object
->output_buffer_size
= vmsize
; /* cache this for use later */
1935 object
->split_info
.linkedKextSize
= vmsize
;
1940 /*******************************************************************************
1941 *******************************************************************************/
1943 kxld_object_export_linked_object(const KXLDObject
*object
,
1947 kern_return_t rval
= KERN_FAILURE
;
1948 KXLDSeg
*seg
= NULL
;
1950 u_long header_size
= 0;
1951 u_long header_offset
= 0;
1952 u_long data_offset
= 0;
1955 boolean_t is_32bit_object
= kxld_object_is_32_bit(object
);
1956 kxld_addr_t link_addr
;
1957 u_char
*my_linked_object
;
1960 check(linked_object
);
1962 if (isOldInterface
) {
1963 size
= object
->output_buffer_size
;
1964 link_addr
= object
->link_addr
;
1965 my_linked_object
= (u_char
*) linked_object
;
1968 size
= ((splitKextLinkInfo
*)linked_object
)->linkedKextSize
;
1969 link_addr
= ((splitKextLinkInfo
*)linked_object
)->vmaddr_TEXT
;
1970 my_linked_object
= ((splitKextLinkInfo
*)linked_object
)->linkedKext
;
1973 /* Calculate the size of the headers and data */
1975 header_size
= get_macho_header_size(object
);
1977 /* Copy data to the file */
1979 ncmds
= object
->segs
.nitems
+ 1 /* LC_SYMTAB */;
1982 /* don't write out a DYSYMTAB segment for targets that can't digest it
1984 if (target_supports_slideable_kexts(object
)) {
1985 ncmds
++; /* dysymtab */
1987 #endif /* KXLD_PIC_KEXTS */
1989 if (object
->uuid
.has_uuid
== TRUE
) {
1993 if (object
->versionmin
.has_versionmin
== TRUE
) {
1997 if (object
->srcversion
.has_srcversion
== TRUE
) {
2001 if (isSplitKext
&& object
->splitinfolc
.has_splitinfolc
) {
2005 rval
= export_macho_header(object
, my_linked_object
, ncmds
, &header_offset
, header_size
);
2006 require_noerr(rval
, finish
);
2008 for (i
= 0; i
< object
->segs
.nitems
; ++i
) {
2009 seg
= kxld_array_get_item(&object
->segs
, i
);
2011 rval
= kxld_seg_export_macho_to_vm(seg
, my_linked_object
, &header_offset
,
2012 header_size
, size
, link_addr
, is_32bit_object
);
2013 require_noerr(rval
, finish
);
2016 seg
= kxld_object_get_seg_by_name(object
, SEG_LINKEDIT
);
2017 data_offset
= (u_long
) (seg
->link_addr
- link_addr
);
2019 // data_offset is used to set the fileoff in the macho header load commands
2020 rval
= kxld_symtab_export_macho(object
->symtab
,
2024 &data_offset
, size
, is_32bit_object
);
2025 require_noerr(rval
, finish
);
2027 // data_offset now points past the symbol tab and strings data in the linkedit
2028 // segment - (it was used to set new values for symoff and stroff)
2031 if (target_supports_slideable_kexts(object
)) {
2032 rval
= kxld_reloc_export_macho(&object
->relocator
,
2038 &data_offset
, size
);
2039 require_noerr(rval
, finish
);
2041 #endif /* KXLD_PIC_KEXTS */
2043 if (object
->uuid
.has_uuid
) {
2044 rval
= kxld_uuid_export_macho(&object
->uuid
, my_linked_object
, &header_offset
, header_size
);
2045 require_noerr(rval
, finish
);
2048 if (object
->versionmin
.has_versionmin
) {
2049 rval
= kxld_versionmin_export_macho(&object
->versionmin
, my_linked_object
, &header_offset
, header_size
);
2050 require_noerr(rval
, finish
);
2053 if (object
->srcversion
.has_srcversion
) {
2054 rval
= kxld_srcversion_export_macho(&object
->srcversion
, my_linked_object
, &header_offset
, header_size
);
2055 require_noerr(rval
, finish
);
2058 if (isSplitKext
&& object
->splitinfolc
.has_splitinfolc
) {
2059 rval
= kxld_splitinfolc_export_macho(&object
->splitinfolc
,
2065 require_noerr(rval
, finish
);
2069 unswap_macho(my_linked_object
, object
->host_order
, object
->target_order
);
2072 rval
= KERN_SUCCESS
;
2078 /*******************************************************************************
2079 *******************************************************************************/
2080 static kern_return_t
2081 export_macho_header(const KXLDObject
*object
, u_char
*buf
, u_int ncmds
,
2082 u_long
*header_offset
, u_long header_size
)
2084 kern_return_t rval
= KERN_FAILURE
;
2088 check(header_offset
);
2090 KXLD_3264_FUNC(kxld_object_is_32_bit(object
), rval
,
2091 export_macho_header_32
, export_macho_header_64
,
2092 object
, buf
, ncmds
, header_offset
, header_size
);
2093 require_noerr(rval
, finish
);
2095 rval
= KERN_SUCCESS
;
2101 #if KXLD_USER_OR_ILP32
2102 /*******************************************************************************
2103 *******************************************************************************/
2104 static kern_return_t
2105 export_macho_header_32(const KXLDObject
*object
, u_char
*buf
, u_int ncmds
,
2106 u_long
*header_offset
, u_long header_size
)
2108 kern_return_t rval
= KERN_FAILURE
;
2109 struct mach_header
*mach
= NULL
;
2113 check(header_offset
);
2115 require_action(sizeof(*mach
) <= header_size
- *header_offset
, finish
,
2117 mach
= (struct mach_header
*) ((void *) (buf
+ *header_offset
));
2119 mach
->magic
= MH_MAGIC
;
2120 mach
->cputype
= object
->cputype
;
2121 mach
->cpusubtype
= object
->cpusubtype
;
2122 mach
->filetype
= object
->filetype
;
2123 mach
->ncmds
= ncmds
;
2124 mach
->sizeofcmds
= (uint32_t) (header_size
- sizeof(*mach
));
2125 mach
->flags
= MH_NOUNDEFS
;
2127 *header_offset
+= sizeof(*mach
);
2129 rval
= KERN_SUCCESS
;
2134 #endif /* KXLD_USER_OR_ILP32 */
2136 #if KXLD_USER_OR_LP64
2137 /*******************************************************************************
2138 *******************************************************************************/
2139 static kern_return_t
2140 export_macho_header_64(const KXLDObject
*object
, u_char
*buf
, u_int ncmds
,
2141 u_long
*header_offset
, u_long header_size
)
2143 kern_return_t rval
= KERN_FAILURE
;
2144 struct mach_header_64
*mach
= NULL
;
2148 check(header_offset
);
2150 require_action(sizeof(*mach
) <= header_size
- *header_offset
, finish
,
2152 mach
= (struct mach_header_64
*) ((void *) (buf
+ *header_offset
));
2154 mach
->magic
= MH_MAGIC_64
;
2155 mach
->cputype
= object
->cputype
;
2156 mach
->cpusubtype
= object
->cpusubtype
;
2157 mach
->filetype
= object
->filetype
;
2158 mach
->ncmds
= ncmds
;
2159 mach
->sizeofcmds
= (uint32_t) (header_size
- sizeof(*mach
));
2160 mach
->flags
= MH_NOUNDEFS
;
2162 *header_offset
+= sizeof(*mach
);
2164 #if SPLIT_KEXTS_DEBUG
2166 kxld_log(kKxldLogLinking
, kKxldLogErr
,
2167 " %p >>> Start of macho header (size %lu) <%s>",
2171 kxld_log(kKxldLogLinking
, kKxldLogErr
,
2172 " %p <<< End of macho header <%s>",
2173 (void *) ((u_char
*)mach
+ sizeof(*mach
)),
2178 rval
= KERN_SUCCESS
;
2183 #endif /* KXLD_USER_OR_LP64 */
2185 /*******************************************************************************
2186 *******************************************************************************/
2188 kxld_object_index_symbols_by_name(KXLDObject
*object
)
2190 return kxld_symtab_index_symbols_by_name(object
->symtab
);
2193 /*******************************************************************************
2194 *******************************************************************************/
2196 kxld_object_index_cxx_symbols_by_value(KXLDObject
*object
)
2198 return kxld_symtab_index_cxx_symbols_by_value(object
->symtab
);
2201 /*******************************************************************************
2202 *******************************************************************************/
2204 kxld_object_relocate(KXLDObject
*object
, kxld_addr_t link_address
)
2206 kern_return_t rval
= KERN_FAILURE
;
2207 KXLDSeg
*seg
= NULL
;
2212 object
->link_addr
= link_address
;
2214 /* Relocate segments (which relocates the sections) */
2215 for (i
= 0; i
< object
->segs
.nitems
; ++i
) {
2216 seg
= kxld_array_get_item(&object
->segs
, i
);
2217 kxld_seg_relocate(seg
, link_address
);
2220 /* Relocate symbols */
2221 rval
= kxld_symtab_relocate(object
->symtab
, &object
->sects
);
2222 require_noerr(rval
, finish
);
2224 rval
= KERN_SUCCESS
;
2229 /*******************************************************************************
2230 *******************************************************************************/
2232 get_mutable_sym(const KXLDObject
*object
, const KXLDSym
*sym
)
2234 KXLDSym
*rval
= NULL
;
2235 kern_return_t result
= KERN_FAILURE
;
2238 result
= kxld_symtab_get_sym_index(object
->symtab
, sym
, &i
);
2239 require_noerr(result
, finish
);
2241 rval
= kxld_symtab_get_symbol_by_index(object
->symtab
, i
);
2242 require_action(rval
== sym
, finish
, rval
=NULL
);
2248 /*******************************************************************************
2249 *******************************************************************************/
2251 kxld_object_resolve_symbol(KXLDObject
*object
,
2252 const KXLDSym
*sym
, kxld_addr_t addr
)
2254 kern_return_t rval
= KERN_FAILURE
;
2255 KXLDSym
*resolved_sym
= NULL
;
2257 resolved_sym
= get_mutable_sym(object
, sym
);
2258 require_action(resolved_sym
, finish
, rval
=KERN_FAILURE
);
2260 rval
= kxld_sym_resolve(resolved_sym
, addr
);
2261 require_noerr(rval
, finish
);
2263 rval
= KERN_SUCCESS
;
2268 /*******************************************************************************
2269 *******************************************************************************/
2271 kxld_object_patch_symbol(KXLDObject
*object
, const struct kxld_sym
*sym
)
2273 kern_return_t rval
= KERN_FAILURE
;
2274 KXLDSym
*patched_sym
= NULL
;
2276 patched_sym
= get_mutable_sym(object
, sym
);
2277 require_action(patched_sym
, finish
, rval
=KERN_FAILURE
);
2279 (void) kxld_sym_patch(patched_sym
);
2280 rval
= KERN_SUCCESS
;
2285 /*******************************************************************************
2286 *******************************************************************************/
2288 kxld_object_add_symbol(KXLDObject
*object
, char *name
, kxld_addr_t link_addr
,
2289 const KXLDSym
**sym_out
)
2291 kern_return_t rval
= KERN_FAILURE
;
2292 KXLDSym
*sym
= NULL
;
2294 rval
= kxld_symtab_add_symbol(object
->symtab
, name
, link_addr
, &sym
);
2295 require_noerr(rval
, finish
);
2298 rval
= KERN_SUCCESS
;
2303 /*******************************************************************************
2304 *******************************************************************************/
2306 kxld_object_process_relocations(KXLDObject
*object
,
2307 const KXLDDict
*patched_vtables
)
2309 kern_return_t rval
= KERN_FAILURE
;
2311 (void) kxld_relocator_set_vtables(&object
->relocator
, patched_vtables
);
2313 /* Process relocation entries and populate the global offset table.
2315 * For final linked images: the relocation entries are contained in a couple
2316 * of tables hanging off the end of the symbol table. The GOT has its own
2317 * section created by the linker; we simply need to fill it.
2319 * For object files: the relocation entries are bound to each section.
2320 * The GOT, if it exists for the target architecture, is created by kxld,
2321 * and we must populate it according to our internal structures.
2323 if (object
->is_final_image
) {
2324 #if KXLD_USER_OR_BUNDLE
2325 rval
= process_symbol_pointers(object
);
2326 require_noerr(rval
, finish
);
2328 rval
= process_relocs_from_tables(object
);
2329 require_noerr(rval
, finish
);
2331 require_action(FALSE
, finish
, rval
=KERN_FAILURE
);
2332 #endif /* KXLD_USER_OR_BUNDLE */
2334 #if KXLD_USER_OR_GOT
2336 rval
= populate_got(object
);
2337 require_noerr(rval
, finish
);
2338 #endif /* KXLD_USER_OR_GOT */
2339 #if KXLD_USER_OR_OBJECT
2340 rval
= process_relocs_from_sections(object
);
2341 require_noerr(rval
, finish
);
2343 require_action(FALSE
, finish
, rval
=KERN_FAILURE
);
2344 #endif /* KXLD_USER_OR_OBJECT */
2347 /* Populate kmod info structure */
2348 rval
= populate_kmod_info(object
);
2349 require_noerr(rval
, finish
);
2351 rval
= KERN_SUCCESS
;
2356 #if KXLD_USER_OR_BUNDLE
2358 #if SPLIT_KEXTS_DEBUG
2359 static boolean_t kxld_show_ptr_value
;
2362 #define SECT_SYM_PTRS "__nl_symbol_ptr"
2364 /*******************************************************************************
2365 * Final linked images create an __nl_symbol_ptr section for the global offset
2366 * table and for symbol pointer lookups in general. Rather than use relocation
2367 * entries, the linker creates an "indirect symbol table" which stores indexes
2368 * into the symbol table corresponding to the entries of this section. This
2369 * function populates the section with the relocated addresses of those symbols.
2370 *******************************************************************************/
2371 static kern_return_t
2372 process_symbol_pointers(KXLDObject
*object
)
2374 kern_return_t rval
= KERN_FAILURE
;
2375 KXLDSect
*sect
= NULL
;
2376 KXLDSym
*sym
= NULL
;
2377 int32_t *symidx
= NULL
;
2378 u_char
*symptr
= NULL
;
2379 u_long symptrsize
= 0;
2386 require_action(object
->is_final_image
&& object
->dysymtab_hdr
,
2387 finish
, rval
=KERN_FAILURE
);
2389 /* Get the __DATA,__nl_symbol_ptr section. If it doesn't exist, we have
2393 sect
= kxld_object_get_sect_by_name(object
, SEG_DATA
, SECT_SYM_PTRS
);
2394 if (!sect
|| !(sect
->flags
& S_NON_LAZY_SYMBOL_POINTERS
)) {
2395 rval
= KERN_SUCCESS
;
2399 /* Calculate the table offset and number of entries in the section */
2401 if (kxld_object_is_32_bit(object
)) {
2402 symptrsize
= sizeof(uint32_t);
2404 symptrsize
= sizeof(uint64_t);
2407 nsyms
= (u_int
) (sect
->size
/ symptrsize
);
2408 firstsym
= sect
->reserved1
;
2410 require_action(firstsym
+ nsyms
<= object
->dysymtab_hdr
->nindirectsyms
,
2411 finish
, rval
=KERN_FAILURE
;
2412 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogMalformedMachO
2413 "firstsym + nsyms > object->dysymtab_hdr->nindirectsyms"));
2415 /* Iterate through the indirect symbol table and fill in the section of
2416 * symbol pointers. There are three cases:
2417 * 1) A normal symbol - put its value directly in the table
2418 * 2) An INDIRECT_SYMBOL_LOCAL - symbols that are local and already have
2419 * their offset from the start of the file in the section. Simply
2420 * add the file's link address to fill this entry.
2421 * 3) An INDIRECT_SYMBOL_ABS - prepopulated absolute symbols. No
2422 * action is required.
2425 if (isOldInterface
) {
2426 symidx
= (int32_t *) ((void *) (object
->file
+ object
->dysymtab_hdr
->indirectsymoff
));
2429 symidx
= (int32_t *) ((void *) (object
->split_info
.kextExecutable
+ object
->dysymtab_hdr
->indirectsymoff
));
2433 symptr
= sect
->data
;
2434 for (i
= 0; i
< nsyms
; ++i
, ++symidx
, symptr
+=symptrsize
) {
2435 if (*symidx
& INDIRECT_SYMBOL_LOCAL
) {
2436 if (*symidx
& INDIRECT_SYMBOL_ABS
) continue;
2438 if (isOldInterface
) {
2439 add_to_ptr(symptr
, object
->link_addr
, kxld_object_is_32_bit(object
));
2442 add_to_ptr(symptr
, object
->split_info
.vmaddr_TEXT
, kxld_object_is_32_bit(object
));
2445 sym
= kxld_symtab_get_symbol_by_index(object
->symtab
, *symidx
);
2446 require_action(sym
, finish
, rval
=KERN_FAILURE
);
2448 if (isOldInterface
) {
2449 add_to_ptr(symptr
, sym
->link_addr
, kxld_object_is_32_bit(object
));
2452 add_to_ptr(symptr
, object
->split_info
.vmaddr_TEXT
, kxld_object_is_32_bit(object
));
2457 rval
= KERN_SUCCESS
;
2462 /*******************************************************************************
2463 *******************************************************************************/
2465 get_seg_by_base_addr(KXLDObject
*object
, kxld_addr_t base_addr
)
2467 KXLDSeg
*seg
= NULL
;
2468 kxld_addr_t start
= 0;
2469 kxld_addr_t end
= 0;
2472 for (i
= 0; i
< object
->segs
.nitems
; ++i
) {
2473 seg
= kxld_array_get_item(&object
->segs
, i
);
2474 start
= seg
->base_addr
;
2475 end
= seg
->base_addr
+ seg
->vmsize
;
2477 if (start
<= base_addr
&& base_addr
< end
) return seg
;
2483 /*******************************************************************************
2484 *******************************************************************************/
2485 static kern_return_t
2486 process_relocs_from_tables(KXLDObject
*object
)
2488 kern_return_t rval
= KERN_FAILURE
;
2489 KXLDReloc
*reloc
= NULL
;
2490 KXLDSeg
*seg
= NULL
;
2493 /* Process external relocations */
2494 for (i
= 0; i
< object
->extrelocs
.nitems
; ++i
) {
2495 reloc
= kxld_array_get_item(&object
->extrelocs
, i
);
2497 seg
= get_seg_by_base_addr(object
, reloc
->address
);
2498 require_action(seg
, finish
, rval
=KERN_FAILURE
);
2500 if (isOldInterface
) {
2501 rval
= kxld_relocator_process_table_reloc(&object
->relocator
, reloc
,
2502 seg
, object
->link_addr
);
2505 kxld_addr_t my_link_addr
= object
->split_info
.vmaddr_TEXT
;
2507 if (kxld_seg_is_text_exec_seg(seg
)) {
2508 my_link_addr
= object
->split_info
.vmaddr_TEXT_EXEC
;
2510 else if (kxld_seg_is_data_seg(seg
)) {
2511 my_link_addr
= object
->split_info
.vmaddr_DATA
;
2513 else if (kxld_seg_is_data_const_seg(seg
)) {
2514 my_link_addr
= object
->split_info
.vmaddr_DATA_CONST
;
2516 else if (kxld_seg_is_llvm_cov_seg(seg
)) {
2517 my_link_addr
= object
->split_info
.vmaddr_LLVM_COV
;
2519 else if (kxld_seg_is_linkedit_seg(seg
)) {
2520 my_link_addr
= object
->split_info
.vmaddr_LINKEDIT
;
2523 rval
= kxld_relocator_process_table_reloc(&object
->relocator
,
2528 require_noerr(rval
, finish
);
2531 /* Process local relocations */
2532 for (i
= 0; i
< object
->locrelocs
.nitems
; ++i
) {
2533 reloc
= kxld_array_get_item(&object
->locrelocs
, i
);
2535 seg
= get_seg_by_base_addr(object
, reloc
->address
);
2536 require_action(seg
, finish
, rval
=KERN_FAILURE
);
2538 if (isOldInterface
) {
2539 rval
= kxld_relocator_process_table_reloc(&object
->relocator
, reloc
,
2540 seg
, object
->link_addr
);
2543 kxld_addr_t my_link_addr
= object
->split_info
.vmaddr_TEXT
;
2545 if (kxld_seg_is_text_exec_seg(seg
)) {
2546 my_link_addr
= object
->split_info
.vmaddr_TEXT_EXEC
;
2548 else if (kxld_seg_is_data_seg(seg
)) {
2549 my_link_addr
= object
->split_info
.vmaddr_DATA
;
2551 else if (kxld_seg_is_data_const_seg(seg
)) {
2552 my_link_addr
= object
->split_info
.vmaddr_DATA_CONST
;
2554 else if (kxld_seg_is_llvm_cov_seg(seg
)) {
2555 my_link_addr
= object
->split_info
.vmaddr_LLVM_COV
;
2557 else if (kxld_seg_is_linkedit_seg(seg
)) {
2558 my_link_addr
= object
->split_info
.vmaddr_LINKEDIT
;
2561 rval
= kxld_relocator_process_table_reloc(&object
->relocator
,
2566 require_noerr(rval
, finish
);
2569 rval
= KERN_SUCCESS
;
2574 /*******************************************************************************
2575 *******************************************************************************/
2577 add_to_ptr(u_char
*symptr
, kxld_addr_t val
, boolean_t is_32_bit
)
2580 uint32_t *ptr
= (uint32_t *) ((void *) symptr
);
2582 *ptr
+= (uint32_t) val
;
2584 uint64_t *ptr
= (uint64_t *) ((void *) symptr
);
2586 *ptr
+= (uint64_t) val
;
2589 #if SPLIT_KEXTS_DEBUG
2590 kxld_show_ptr_value
= FALSE
;
2594 #endif /* KXLD_USER_OR_BUNDLE */
2596 #if KXLD_USER_OR_OBJECT
2597 /*******************************************************************************
2598 *******************************************************************************/
2599 static kern_return_t
2600 process_relocs_from_sections(KXLDObject
*object
)
2602 kern_return_t rval
= KERN_FAILURE
;
2603 KXLDSect
*sect
= NULL
;
2606 for (i
= 0; i
< object
->sects
.nitems
; ++i
) {
2607 sect
= kxld_array_get_item(&object
->sects
, i
);
2608 rval
= kxld_sect_process_relocs(sect
, &object
->relocator
);
2609 require_noerr(rval
, finish
);
2612 rval
= KERN_SUCCESS
;
2616 #endif /* KXLD_USER_OR_OBJECT */
2618 /*******************************************************************************
2619 *******************************************************************************/
2620 static kern_return_t
2621 populate_kmod_info(KXLDObject
*object
)
2623 kern_return_t rval
= KERN_FAILURE
;
2624 KXLDSect
*kmodsect
= NULL
;
2625 KXLDSym
*kmodsym
= NULL
;
2626 kmod_info_t
*kmod_info
= NULL
;
2627 u_long kmod_offset
= 0;
2631 if (kxld_object_is_kernel(object
)) {
2632 rval
= KERN_SUCCESS
;
2636 kxld_object_get_vmsize(object
, &header_size
, &size
);
2638 kmodsym
= kxld_symtab_get_locally_defined_symbol_by_name(object
->symtab
,
2639 KXLD_KMOD_INFO_SYMBOL
);
2640 require_action(kmodsym
, finish
, rval
=KERN_FAILURE
;
2641 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogNoKmodInfo
));
2643 kmodsect
= kxld_array_get_item(&object
->sects
, kmodsym
->sectnum
);
2645 kmod_offset
= (u_long
) (kmodsym
->base_addr
- kmodsect
->base_addr
);
2646 kmod_info
= (kmod_info_t
*) ((void *) (kmodsect
->data
+ kmod_offset
));
2648 if (kxld_object_is_32_bit(object
)) {
2649 kmod_info_32_v1_t
*kmod
= (kmod_info_32_v1_t
*) (kmod_info
);
2651 if (isOldInterface
) {
2652 kmod
->address
= (uint32_t) object
->link_addr
;
2655 kmod
->address
= (uint32_t) object
->split_info
.vmaddr_TEXT
;
2658 kmod
->size
= (uint32_t) size
;
2659 kmod
->hdr_size
= (uint32_t) header_size
;
2662 if (kxld_object_target_needs_swap(object
)) {
2663 kmod
->address
= OSSwapInt32(kmod
->address
);
2664 kmod
->size
= OSSwapInt32(kmod
->size
);
2665 kmod
->hdr_size
= OSSwapInt32(kmod
->hdr_size
);
2667 #endif /* !KERNEL */
2669 kmod_info_64_v1_t
*kmod
= (kmod_info_64_v1_t
*) (kmod_info
);
2671 if (isOldInterface
) {
2672 kmod
->address
= object
->link_addr
;
2675 kmod
->address
= object
->split_info
.vmaddr_TEXT
;
2679 kmod
->hdr_size
= header_size
;
2682 if (kxld_object_target_needs_swap(object
)) {
2683 kmod
->address
= OSSwapInt64(kmod
->address
);
2684 kmod
->size
= OSSwapInt64(kmod
->size
);
2685 kmod
->hdr_size
= OSSwapInt64(kmod
->hdr_size
);
2687 #endif /* !KERNEL */
2689 #if SPLIT_KEXTS_DEBUG
2691 kxld_log(kKxldLogLinking
, kKxldLogErr
,
2692 " kmodsect %p kmod_info %p = kmodsect->data %p + kmod_offset %lu <%s>",
2695 (void *) kmodsect
->data
,
2699 kxld_log(kKxldLogLinking
, kKxldLogErr
,
2700 " kmod_info data: address %p size %llu hdr_size %llu start_addr %p stop_addr %p <%s>",
2701 (void *) kmod
->address
,
2704 (void *) kmod
->start_addr
,
2705 (void *) kmod
->stop_addr
,
2712 rval
= KERN_SUCCESS
;
2719 /*******************************************************************************
2720 *******************************************************************************/
2722 target_supports_slideable_kexts(const KXLDObject
*object
)
2726 return (object
->cputype
!= CPU_TYPE_I386
&& object
->include_kaslr_relocs
);
2728 #endif /* KXLD_PIC_KEXTS */