2 * Copyright (c) 2008 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 <mach/machine.h>
30 #include <mach/vm_param.h>
31 #include <mach/vm_types.h>
32 #include <mach/kmod.h>
33 #include <mach-o/loader.h>
34 #include <mach-o/nlist.h>
35 #include <mach-o/reloc.h>
36 #include <sys/types.h>
39 #include <libkern/kernel_mach_header.h>
40 #include <libkern/OSKextLib.h>
41 #include <libkern/OSKextLibPrivate.h>
42 #include <mach/vm_param.h>
43 #include <mach-o/fat.h>
45 #include <architecture/byte_order.h>
46 #include <mach/mach_init.h>
47 #include <mach-o/arch.h>
48 #include <mach-o/swap.h>
51 #define DEBUG_ASSERT_COMPONENT_NAME_STRING "kxld"
52 #include <AssertMacros.h>
54 #include "kxld_demangle.h"
55 #include "kxld_dict.h"
56 #include "kxld_kext.h"
57 #include "kxld_object.h"
58 #include "kxld_reloc.h"
59 #include "kxld_sect.h"
61 #include "kxld_symtab.h"
62 #include "kxld_util.h"
63 #include "kxld_uuid.h"
64 #include "kxld_vtable.h"
66 struct symtab_command
;
70 KXLDObject
*interface
;
72 KXLDDict vtable_index
;
73 boolean_t vtables_created
;
74 boolean_t vtable_index_created
;
77 /*******************************************************************************
79 *******************************************************************************/
81 static kern_return_t
export_symbols_through_interface(
82 const KXLDObject
*kext
, const KXLDObject
*interface
,
83 KXLDDict
*defined_symbols_by_name
,
84 KXLDDict
*defined_cxx_symbol_by_value
,
85 KXLDDict
*obsolete_symbols_by_name
);
86 static kern_return_t
export_symbols(const KXLDObject
*kext
,
87 KXLDDict
*defined_symbols_by_name
,
88 KXLDDict
*defined_cxx_symbols_by_value
);
90 static kern_return_t
create_vtables(KXLDKext
*kext
,
91 const KXLDDict
*defined_symbols
, const KXLDDict
*defined_cxx_symbols
);
92 static kern_return_t
get_vtable_syms_from_smcp(KXLDKext
*kext
,
93 const KXLDDict
*defined_symbols
, KXLDSym
*super_metaclass_ptr_sym
,
94 KXLDSym
**vtable_sym_out
, KXLDSym
**meta_vtable_sym_out
);
96 static kern_return_t
resolve_symbols(KXLDKext
*kext
,
97 const KXLDDict
*defined_symbols
, const KXLDDict
*obsolete_symbols
);
99 static kern_return_t
patch_vtables(KXLDKext
*kext
, KXLDDict
*patched_vtables
,
100 const KXLDDict
*defined_symbols
);
101 static const KXLDSym
*get_metaclass_symbol_from_super_meta_class_pointer_symbol(
102 KXLDKext
*kext
, KXLDSym
*super_metaclass_pointer_sym
);
103 static kern_return_t
create_vtable_index(KXLDKext
*kext
);
105 static kern_return_t
validate_symbols(KXLDKext
*kext
);
107 /*******************************************************************************
108 *******************************************************************************/
110 kxld_kext_sizeof(void)
112 return sizeof(KXLDKext
);
115 /*******************************************************************************
116 *******************************************************************************/
118 kxld_kext_init(KXLDKext
*kext
, KXLDObject
*kext_object
,
119 KXLDObject
*interface_object
)
121 kern_return_t rval
= KERN_FAILURE
;
126 kext
->kext
= kext_object
;
128 if (interface_object
) {
129 kext
->interface
= interface_object
;
131 rval
= kxld_object_index_symbols_by_name(kext
->kext
);
132 require_noerr(rval
, finish
);
140 /*******************************************************************************
141 *******************************************************************************/
143 kxld_kext_clear(KXLDKext
*kext
)
145 KXLDVTable
*vtable
= NULL
;
150 for (i
= 0; i
< kext
->vtables
.nitems
; ++i
) {
151 vtable
= kxld_array_get_item(&kext
->vtables
, i
);
152 kxld_vtable_clear(vtable
);
154 kxld_array_reset(&kext
->vtables
);
155 kxld_dict_clear(&kext
->vtable_index
);
158 kext
->interface
= NULL
;
159 kext
->vtables_created
= FALSE
;
160 kext
->vtable_index_created
= FALSE
;
164 /*******************************************************************************
165 *******************************************************************************/
167 kxld_kext_deinit(KXLDKext
*kext
)
169 KXLDVTable
*vtable
= NULL
;
174 for (i
= 0; i
< kext
->vtables
.maxitems
; ++i
) {
175 vtable
= kxld_array_get_slot(&kext
->vtables
, i
);
176 kxld_vtable_deinit(vtable
);
178 kxld_array_deinit(&kext
->vtables
);
179 kxld_dict_deinit(&kext
->vtable_index
);
181 bzero(kext
, sizeof(*kext
));
184 /*******************************************************************************
185 *******************************************************************************/
187 kxld_kext_export_symbols(const KXLDKext
*kext
,
188 struct kxld_dict
*defined_symbols_by_name
,
189 struct kxld_dict
*obsolete_symbols_by_name
,
190 struct kxld_dict
*defined_cxx_symbols_by_value
)
192 kern_return_t rval
= KERN_FAILURE
;
196 if (kext
->interface
) {
197 rval
= export_symbols_through_interface(kext
->kext
, kext
->interface
,
198 defined_symbols_by_name
, obsolete_symbols_by_name
,
199 defined_cxx_symbols_by_value
);
200 require_noerr(rval
, finish
);
202 rval
= export_symbols(kext
->kext
, defined_symbols_by_name
,
203 defined_cxx_symbols_by_value
);
204 require_noerr(rval
, finish
);
212 /*******************************************************************************
213 *******************************************************************************/
215 export_symbols_through_interface(const KXLDObject
*kext
,
216 const KXLDObject
*interface
, KXLDDict
*defined_symbols_by_name
,
217 KXLDDict
*obsolete_symbols_by_name
, KXLDDict
*defined_cxx_symbols_by_value
)
219 kern_return_t rval
= KERN_FAILURE
;
220 KXLDSymtabIterator iter
;
221 const KXLDSymtab
*kext_symtab
= NULL
;
222 const KXLDSymtab
*interface_symtab
= NULL
;
223 KXLDSym
*kext_sym
= NULL
;
224 const KXLDSym
*interface_sym
= NULL
;
229 kext_symtab
= kxld_object_get_symtab(kext
);
230 interface_symtab
= kxld_object_get_symtab(interface
);
232 if (defined_symbols_by_name
) {
233 /* Add exported symbols */
234 (void) kxld_symtab_iterator_init(&iter
, interface_symtab
,
235 kxld_sym_is_undefined
, FALSE
);
236 while ((interface_sym
= kxld_symtab_iterator_get_next(&iter
))) {
237 kext_sym
= kxld_symtab_get_locally_defined_symbol_by_name(kext_symtab
,
238 interface_sym
->name
);
240 kxld_log(kKxldLogLinking
, kKxldLogWarn
,
241 "In interface %s of %s, couldn't find symbol %s\n",
242 kxld_object_get_name(interface
), kxld_object_get_name(kext
),
243 interface_sym
->name
);
247 rval
= kxld_dict_insert(defined_symbols_by_name
,
248 kext_sym
->name
, kext_sym
);
249 require_noerr(rval
, finish
);
252 /* Add indirect symbols */
253 (void) kxld_symtab_iterator_init(&iter
, interface_symtab
,
254 kxld_sym_is_indirect
, FALSE
);
255 while ((interface_sym
= kxld_symtab_iterator_get_next(&iter
))) {
256 kext_sym
= kxld_symtab_get_locally_defined_symbol_by_name(kext_symtab
,
257 interface_sym
->alias
);
259 kxld_log(kKxldLogLinking
, kKxldLogWarn
,
260 "In interface %s of %s, couldn't find indirect symbol %s (%s)\n",
261 kxld_object_get_name(interface
), kxld_object_get_name(kext
),
262 interface_sym
->alias
, interface_sym
->name
);
266 rval
= kxld_dict_insert(defined_symbols_by_name
,
267 interface_sym
->name
, kext_sym
);
268 require_noerr(rval
, finish
);
272 /* Add obsolete symbols */
273 if (obsolete_symbols_by_name
) {
274 (void) kxld_symtab_iterator_init(&iter
, interface_symtab
,
275 kxld_sym_is_obsolete
, FALSE
);
276 while ((kext_sym
= kxld_symtab_iterator_get_next(&iter
))) {
277 rval
= kxld_dict_insert(obsolete_symbols_by_name
,
278 kext_sym
->name
, kext_sym
);
279 require_noerr(rval
, finish
);
283 /* Add C++ symbols */
284 if (defined_cxx_symbols_by_value
) {
285 (void) kxld_symtab_iterator_init(&iter
, kext_symtab
,
286 kxld_sym_is_cxx
, FALSE
);
287 while ((kext_sym
= kxld_symtab_iterator_get_next(&iter
))) {
288 rval
= kxld_dict_insert(defined_cxx_symbols_by_value
,
289 &kext_sym
->link_addr
, kext_sym
);
290 require_noerr(rval
, finish
);
299 /*******************************************************************************
300 *******************************************************************************/
302 export_symbols(const KXLDObject
*kext
, KXLDDict
*defined_symbols_by_name
,
303 KXLDDict
*defined_cxx_symbols_by_value
)
305 kern_return_t rval
= KERN_FAILURE
;
306 KXLDSymtabIterator iter
;
309 (void) kxld_symtab_iterator_init(&iter
, kxld_object_get_symtab(kext
),
310 kxld_sym_is_exported
, FALSE
);
311 while ((sym
= kxld_symtab_iterator_get_next(&iter
))) {
312 if (defined_symbols_by_name
) {
313 rval
= kxld_dict_insert(defined_symbols_by_name
, sym
->name
, sym
);
314 require_noerr(rval
, finish
);
317 if (kxld_sym_is_cxx(sym
) && defined_cxx_symbols_by_value
) {
318 rval
= kxld_dict_insert(defined_cxx_symbols_by_value
,
319 &sym
->link_addr
, sym
);
320 require_noerr(rval
, finish
);
329 /*******************************************************************************
330 *******************************************************************************/
332 kxld_kext_export_vtables(KXLDKext
*kext
, const KXLDDict
*defined_cxx_symbols
,
333 const KXLDDict
*defined_symbols
, KXLDDict
*vtables
)
335 kern_return_t rval
= KERN_FAILURE
;
336 KXLDVTable
*vtable
= NULL
;
340 check(defined_symbols
);
341 check(defined_cxx_symbols
);
344 rval
= create_vtables(kext
, defined_cxx_symbols
, defined_symbols
);
345 require_noerr(rval
, finish
);
347 for (i
= 0; i
< kext
->vtables
.nitems
; ++i
) {
348 vtable
= kxld_array_get_item(&kext
->vtables
, i
);
350 rval
= kxld_dict_insert(vtables
, vtable
->name
, vtable
);
351 require_noerr(rval
, finish
);
359 /*******************************************************************************
360 *******************************************************************************/
362 kxld_kext_get_vmsize(const KXLDKext
*kext
,
363 u_long
*header_size
, u_long
*vmsize
)
365 (void) kxld_object_get_vmsize(kext
->kext
, header_size
, vmsize
);
368 /*******************************************************************************
369 *******************************************************************************/
371 kxld_kext_export_linked_object(const KXLDKext
*kext
,
372 u_char
*linked_object
, kxld_addr_t
*kmod_info
)
374 kern_return_t rval
= KERN_FAILURE
;
375 const KXLDSym
*kmodsym
= NULL
;
377 kmodsym
= kxld_symtab_get_locally_defined_symbol_by_name(
378 kxld_object_get_symtab(kext
->kext
), KXLD_KMOD_INFO_SYMBOL
);
379 require_action(kmodsym
, finish
, rval
=KERN_FAILURE
;
380 kxld_log(kKxldLogLinking
, kKxldLogErr
, kKxldLogNoKmodInfo
));
382 *kmod_info
= kmodsym
->link_addr
;
384 rval
= kxld_object_export_linked_object(kext
->kext
, linked_object
);
389 /*******************************************************************************
390 *******************************************************************************/
392 kxld_kext_relocate(KXLDKext
*kext
, kxld_addr_t link_address
,
393 KXLDDict
*patched_vtables
, const KXLDDict
*defined_symbols
,
394 const KXLDDict
*obsolete_symbols
, const KXLDDict
*defined_cxx_symbols
)
396 kern_return_t rval
= KERN_FAILURE
;
399 check(patched_vtables
);
400 check(defined_symbols
);
401 check(obsolete_symbols
);
403 /* Kexts that are being relocated need symbols indexed by value for vtable
404 * creation and patching. Note that we don't need to index by value for
405 * dependencies that have already been linked because their symbols are
406 * already in the global cxx value table. It's important to index the
407 * symbols by value before we relocate the symbols because the vtable
408 * entries will still have unrelocated values.
410 rval
= kxld_object_index_cxx_symbols_by_value(kext
->kext
);
411 require_noerr(rval
, finish
);
413 rval
= kxld_object_index_symbols_by_name(kext
->kext
);
414 require_noerr(rval
, finish
);
416 rval
= kxld_object_relocate(kext
->kext
, link_address
);
417 require_noerr(rval
, finish
);
419 rval
= resolve_symbols(kext
, defined_symbols
, obsolete_symbols
);
420 require_noerr(rval
, finish
);
422 rval
= create_vtables(kext
, defined_cxx_symbols
, /* defined_symbols */ NULL
);
423 require_noerr(rval
, finish
);
425 rval
= patch_vtables(kext
, patched_vtables
, defined_symbols
);
426 require_noerr(rval
, finish
);
428 rval
= validate_symbols(kext
);
429 require_noerr(rval
, finish
);
431 rval
= kxld_object_process_relocations(kext
->kext
, patched_vtables
);
432 require_noerr(rval
, finish
);
439 /*******************************************************************************
440 * The defined symbols argument is optional. When supplied, create_vtables()
441 * will look for vtable symbols in the defined_symbols dictionary. Otherwise,
442 * it will look in the kext's symbol table for vtable symbols.
444 * We do this because there are two types of KXLDKext objects that call
445 * create_vtables(), those that have been linked, and those that haven't. The
446 * linked kexts export their symbols into the global symbol table that is used
447 * for symbol resolution, so we can look there for vtable symbols without
448 * having to index their local symbol table separately.
450 * Unlinked kexts haven't yet had their symbols exported into the global table,
451 * so we have to index their local symbol table separately.
452 *******************************************************************************/
454 create_vtables(KXLDKext
*kext
, const KXLDDict
*defined_cxx_symbols
,
455 const KXLDDict
*defined_symbols
)
457 kern_return_t rval
= KERN_FAILURE
;
458 const KXLDSymtab
*symtab
= NULL
;
459 KXLDSymtabIterator iter
;
461 KXLDSym
*vtable_sym
= NULL
;
462 KXLDSym
*meta_vtable_sym
= NULL
;
463 KXLDVTable
*vtable
= NULL
;
464 KXLDVTable
*meta_vtable
= NULL
;
468 if (kext
->vtables_created
) {
473 symtab
= kxld_object_get_symtab(kext
->kext
);
475 if (kxld_object_is_linked(kext
->kext
)) {
476 /* Create a vtable object for every vtable symbol */
477 kxld_symtab_iterator_init(&iter
, symtab
, kxld_sym_is_vtable
, FALSE
);
478 nvtables
= kxld_symtab_iterator_get_num_remaining(&iter
);
480 /* We walk over the super metaclass pointer symbols because classes
481 * with them are the only ones that need patching. Then we double the
482 * number of vtables we're expecting, because every pointer will have a
483 * class vtable and a MetaClass vtable.
485 kxld_symtab_iterator_init(&iter
, symtab
,
486 kxld_sym_is_super_metaclass_pointer
, FALSE
);
487 nvtables
= kxld_symtab_iterator_get_num_remaining(&iter
) * 2;
490 rval
= kxld_array_init(&kext
->vtables
, sizeof(KXLDVTable
), nvtables
);
491 require_noerr(rval
, finish
);
493 while ((sym
= kxld_symtab_iterator_get_next(&iter
))) {
494 if (kxld_object_is_linked(kext
->kext
)) {
496 meta_vtable_sym
= NULL
;
499 rval
= get_vtable_syms_from_smcp(kext
, defined_symbols
, sym
,
500 &vtable_sym
, &meta_vtable_sym
);
501 require_noerr(rval
, finish
);
504 vtable
= kxld_array_get_item(&kext
->vtables
, i
++);
505 rval
= kxld_vtable_init(vtable
, vtable_sym
, kext
->kext
,
506 defined_cxx_symbols
);
507 require_noerr(rval
, finish
);
509 /* meta_vtable_sym will be null when we don't support strict
510 * patching and can't find the metaclass vtable. If that's the
511 * case, we just reduce the expect number of vtables by 1.
513 if (!kxld_object_is_linked(kext
->kext
)) {
514 if (meta_vtable_sym
) {
515 meta_vtable
= kxld_array_get_item(&kext
->vtables
, i
++);
516 rval
= kxld_vtable_init(meta_vtable
, meta_vtable_sym
,
517 kext
->kext
, defined_cxx_symbols
);
518 require_noerr(rval
, finish
);
520 kxld_array_resize(&kext
->vtables
, --nvtables
);
525 require_action(i
== kext
->vtables
.nitems
, finish
,
528 kext
->vtables_created
= TRUE
;
534 /*******************************************************************************
535 *******************************************************************************/
537 get_vtable_syms_from_smcp(KXLDKext
*kext
, const KXLDDict
*defined_symbols
,
538 KXLDSym
*super_metaclass_ptr_sym
, KXLDSym
**vtable_sym_out
,
539 KXLDSym
**meta_vtable_sym_out
)
541 kern_return_t rval
= KERN_FAILURE
;
542 const KXLDSymtab
*symtab
= NULL
;
543 KXLDSym
*vtable_sym
= NULL
;
544 KXLDSym
*meta_vtable_sym
= NULL
;
545 char class_name
[KXLD_MAX_NAME_LEN
];
546 char vtable_name
[KXLD_MAX_NAME_LEN
];
547 char meta_vtable_name
[KXLD_MAX_NAME_LEN
];
548 char *demangled_name1
= NULL
;
549 char *demangled_name2
= NULL
;
550 size_t demangled_length1
= 0;
551 size_t demangled_length2
= 0;
554 check(vtable_sym_out
);
555 check(meta_vtable_sym_out
);
557 require(!kxld_object_is_kernel(kext
->kext
), finish
);
559 symtab
= kxld_object_get_symtab(kext
->kext
);
561 /* Get the class name from the smc pointer */
562 rval
= kxld_sym_get_class_name_from_super_metaclass_pointer(
563 super_metaclass_ptr_sym
, class_name
, sizeof(class_name
));
564 require_noerr(rval
, finish
);
566 /* Get the vtable name from the class name */
567 rval
= kxld_sym_get_vtable_name_from_class_name(class_name
,
568 vtable_name
, sizeof(vtable_name
));
569 require_noerr(rval
, finish
);
571 /* Get the vtable symbol */
572 if (defined_symbols
) {
573 vtable_sym
= kxld_dict_find(defined_symbols
, vtable_name
);
575 vtable_sym
= kxld_symtab_get_locally_defined_symbol_by_name(symtab
,
578 require_action(vtable_sym
, finish
, rval
=KERN_FAILURE
;
579 kxld_log(kKxldLogPatching
, kKxldLogErr
, kKxldLogMissingVtable
,
580 vtable_name
, class_name
));
582 /* Get the meta vtable name from the class name */
583 rval
= kxld_sym_get_meta_vtable_name_from_class_name(class_name
,
584 meta_vtable_name
, sizeof(meta_vtable_name
));
585 require_noerr(rval
, finish
);
587 /* Get the meta vtable symbol */
588 if (defined_symbols
) {
589 meta_vtable_sym
= kxld_dict_find(defined_symbols
, meta_vtable_name
);
591 meta_vtable_sym
= kxld_symtab_get_locally_defined_symbol_by_name(symtab
,
594 if (!meta_vtable_sym
) {
595 if (kxld_object_target_supports_strict_patching(kext
->kext
)) {
596 kxld_log(kKxldLogPatching
, kKxldLogErr
,
597 kKxldLogMissingVtable
,
598 meta_vtable_name
, class_name
);
602 kxld_log(kKxldLogPatching
, kKxldLogErr
,
603 "Warning: " kKxldLogMissingVtable
,
604 kxld_demangle(meta_vtable_name
, &demangled_name1
,
606 kxld_demangle(class_name
, &demangled_name2
,
607 &demangled_length2
));
611 *vtable_sym_out
= vtable_sym
;
612 *meta_vtable_sym_out
= meta_vtable_sym
;
615 if (demangled_name1
) kxld_free(demangled_name1
, demangled_length1
);
616 if (demangled_name2
) kxld_free(demangled_name2
, demangled_length2
);
621 /*******************************************************************************
622 *******************************************************************************/
624 resolve_symbols(KXLDKext
*kext
, const KXLDDict
*defined_symbols
,
625 const KXLDDict
*obsolete_symbols
)
627 kern_return_t rval
= KERN_FAILURE
;
628 const KXLDSymtab
*symtab
= NULL
;
629 KXLDSymtabIterator iter
;
631 KXLDSym
*defined_sym
= NULL
;
632 const char *name
= NULL
;
633 boolean_t tests_for_weak
= FALSE
;
634 boolean_t error
= FALSE
;
635 char *demangled_name
= NULL
;
636 size_t demangled_length
= 0;
639 check(defined_symbols
);
640 check(obsolete_symbols
);
642 symtab
= kxld_object_get_symtab(kext
->kext
);
644 /* Check if the kext tests for weak symbols */
645 sym
= kxld_symtab_get_symbol_by_name(symtab
, KXLD_WEAK_TEST_SYMBOL
);
646 tests_for_weak
= (sym
!= NULL
);
648 /* Check for duplicate symbols */
649 kxld_symtab_iterator_init(&iter
, symtab
, kxld_sym_is_exported
, FALSE
);
650 while ((sym
= kxld_symtab_iterator_get_next(&iter
))) {
651 defined_sym
= kxld_dict_find(defined_symbols
, sym
->name
);
653 /* Not a problem if the symbols have the same address */
654 if (defined_sym
->link_addr
== sym
->link_addr
) {
660 kxld_log(kKxldLogLinking
, kKxldLogErr
,
661 "The following symbols were defined more than once:");
664 kxld_log(kKxldLogLinking
, kKxldLogErr
, "\t%s: %p - %p",
665 kxld_demangle(sym
->name
, &demangled_name
, &demangled_length
),
666 (void *) (uintptr_t) sym
->link_addr
,
667 (void *) (uintptr_t) defined_sym
->link_addr
);
670 require_noerr_action(error
, finish
, rval
=KERN_FAILURE
);
672 /* Resolve undefined and indirect symbols */
674 /* Iterate over all unresolved symbols */
675 kxld_symtab_iterator_init(&iter
, symtab
,
676 kxld_sym_is_unresolved
, FALSE
);
677 while ((sym
= kxld_symtab_iterator_get_next(&iter
))) {
679 /* Common symbols are not supported */
680 if (kxld_sym_is_common(sym
)) {
684 if (kxld_object_target_supports_common_symbols(kext
->kext
)) {
685 kxld_log(kKxldLogLinking
, kKxldLogErr
,
686 "The following common symbols were not resolved:");
688 kxld_log(kKxldLogLinking
, kKxldLogErr
,
689 "Common symbols are not supported in kernel extensions. "
690 "Use -fno-common to build your kext. "
691 "The following are common symbols:");
694 kxld_log(kKxldLogLinking
, kKxldLogErr
, "\t%s",
695 kxld_demangle(sym
->name
, &demangled_name
, &demangled_length
));
699 /* Find the address of the defined symbol */
700 if (kxld_sym_is_undefined(sym
)) {
705 defined_sym
= kxld_dict_find(defined_symbols
, name
);
707 /* Resolve the symbol. If a definition cannot be found, then:
708 * 1) Psuedokexts log a warning and proceed
709 * 2) Actual kexts delay the error until validation in case vtable
710 * patching replaces the undefined symbol.
715 rval
= kxld_sym_resolve(sym
, defined_sym
->link_addr
);
716 require_noerr(rval
, finish
);
718 if (obsolete_symbols
&& kxld_dict_find(obsolete_symbols
, name
)) {
719 kxld_log(kKxldLogLinking
, kKxldLogWarn
,
720 "This kext uses obsolete symbol %s.",
721 kxld_demangle(name
, &demangled_name
, &demangled_length
));
724 } else if (kxld_sym_is_weak(sym
)) {
725 kxld_addr_t addr
= 0;
727 /* Make sure that the kext has referenced gOSKextUnresolved.
729 require_action(tests_for_weak
, finish
,
731 kxld_log(kKxldLogLinking
, kKxldLogErr
,
732 "This kext has weak references but does not test for "
733 "them. Test for weak references with "
734 "OSKextIsSymbolResolved()."));
737 /* Get the address of the default weak address.
739 addr
= (kxld_addr_t
) &kext_weak_symbol_referenced
;
741 /* This is run during symbol generation only, so we only
742 * need a filler value here.
747 rval
= kxld_sym_resolve(sym
, addr
);
748 require_noerr(rval
, finish
);
752 require_noerr_action(error
, finish
, rval
=KERN_FAILURE
);
757 if (demangled_name
) kxld_free(demangled_name
, demangled_length
);
762 /*******************************************************************************
763 * We must patch vtables to ensure binary compatibility, and to perform that
764 * patching, we have to determine the vtables' inheritance relationships. The
765 * MetaClass system gives us a way to do that:
766 * 1) Iterate over all of the super MetaClass pointer symbols. Every class
767 * that inherits from OSObject will have a pointer in its MetaClass that
768 * points to the MetaClass's super MetaClass.
769 * 2) Derive the name of the class from the super MetaClass pointer.
770 * 3) Derive the name of the class's vtable from the name of the class
771 * 4) Follow the super MetaClass pointer to get the address of the super
773 * 5) Look up the super MetaClass symbol by address
774 * 6) Derive the super class's name from the super MetaClass name
775 * 7) Derive the super class's vtable from the super class's name
776 * This procedure will allow us to find all of the OSObject-derived classes and
777 * their super classes, and thus patch all of the vtables.
779 * We also have to take care to patch up the MetaClass's vtables. The
780 * MetaClasses follow a parallel hierarchy to the classes, so once we have the
781 * class name and super class name, we can also derive the MetaClass name and
782 * the super MetaClass name, and thus find and patch their vtables as well.
783 *******************************************************************************/
785 #define kOSMetaClassVTableName "__ZTV11OSMetaClass"
788 patch_vtables(KXLDKext
*kext
, KXLDDict
*patched_vtables
,
789 const KXLDDict
*defined_symbols
)
791 kern_return_t rval
= KERN_FAILURE
;
792 KXLDSymtabIterator iter
;
793 const KXLDSymtab
*symtab
= NULL
;
794 const KXLDSym
*metaclass
= NULL
;
795 KXLDSym
*super_metaclass_pointer
= NULL
;
796 KXLDSym
*final_sym
= NULL
;
797 KXLDVTable
*vtable
= NULL
;
798 KXLDVTable
*super_vtable
= NULL
;
799 char class_name
[KXLD_MAX_NAME_LEN
];
800 char super_class_name
[KXLD_MAX_NAME_LEN
];
801 char vtable_name
[KXLD_MAX_NAME_LEN
];
802 char super_vtable_name
[KXLD_MAX_NAME_LEN
];
803 char final_sym_name
[KXLD_MAX_NAME_LEN
];
804 char *demangled_name1
= NULL
;
805 char *demangled_name2
= NULL
;
806 size_t demangled_length1
= 0;;
807 size_t demangled_length2
= 0;
812 boolean_t failure
= FALSE
;
815 check(patched_vtables
);
817 symtab
= kxld_object_get_symtab(kext
->kext
);
819 rval
= create_vtable_index(kext
);
820 require_noerr(rval
, finish
);
822 /* Find each super meta class pointer symbol */
824 kxld_symtab_iterator_init(&iter
, symtab
,
825 kxld_sym_is_super_metaclass_pointer
, FALSE
);
826 nvtables
= kxld_symtab_iterator_get_num_remaining(&iter
);
828 while (npatched
< nvtables
) {
831 kxld_symtab_iterator_reset(&iter
);
832 while((super_metaclass_pointer
= kxld_symtab_iterator_get_next(&iter
)))
834 /* Get the class name from the smc pointer */
835 rval
= kxld_sym_get_class_name_from_super_metaclass_pointer(
836 super_metaclass_pointer
, class_name
, sizeof(class_name
));
837 require_noerr(rval
, finish
);
839 /* Get the vtable name from the class name */
840 rval
= kxld_sym_get_vtable_name_from_class_name(class_name
,
841 vtable_name
, sizeof(vtable_name
));
842 require_noerr(rval
, finish
);
844 /* Get the vtable and make sure it hasn't been patched */
845 vtable
= kxld_dict_find(&kext
->vtable_index
, vtable_name
);
846 require_action(vtable
, finish
, rval
=KERN_FAILURE
;
847 kxld_log(kKxldLogPatching
, kKxldLogErr
, kKxldLogMissingVtable
,
848 vtable_name
, class_name
));
850 if (!vtable
->is_patched
) {
852 /* Find the SMCP's meta class symbol */
853 metaclass
= get_metaclass_symbol_from_super_meta_class_pointer_symbol(
854 kext
, super_metaclass_pointer
);
855 require_action(metaclass
, finish
, rval
=KERN_FAILURE
);
857 /* Get the super class name from the super metaclass */
858 rval
= kxld_sym_get_class_name_from_metaclass(metaclass
,
859 super_class_name
, sizeof(super_class_name
));
860 require_noerr(rval
, finish
);
862 /* Get the super vtable name from the class name */
863 rval
= kxld_sym_get_vtable_name_from_class_name(super_class_name
,
864 super_vtable_name
, sizeof(super_vtable_name
));
865 require_noerr(rval
, finish
);
867 /* Get the super vtable if it's been patched */
868 super_vtable
= kxld_dict_find(patched_vtables
, super_vtable_name
);
871 const KXLDVTable
*unpatched_super_vtable
;
872 unpatched_super_vtable
= kxld_dict_find(&kext
->vtable_index
,
875 /* If the parent's vtable hasn't been patched, warn that
876 * this vtable is unpatchable because of the parent.
879 kxld_log(kKxldLogPatching
, kKxldLogErr
,
880 "The %s was not patched because its parent, "
881 "the %s, was not %s.",
882 kxld_demangle(vtable_name
, &demangled_name1
,
884 kxld_demangle(super_vtable_name
, &demangled_name2
,
886 (unpatched_super_vtable
) ? "patchable" : "found");
891 if (!super_vtable
) continue;
893 /* Get the final symbol's name from the super vtable */
894 rval
= kxld_sym_get_final_sym_name_from_class_name(super_class_name
,
895 final_sym_name
, sizeof(final_sym_name
));
896 require_noerr(rval
, finish
);
898 /* Verify that the final symbol does not exist. First check
899 * all the externally defined symbols, then check locally.
901 final_sym
= kxld_dict_find(defined_symbols
, final_sym_name
);
903 final_sym
= kxld_symtab_get_locally_defined_symbol_by_name(
904 symtab
, final_sym_name
);
907 kxld_log(kKxldLogPatching
, kKxldLogErr
,
908 "Class '%s' is a subclass of final class '%s'.",
909 kxld_demangle(class_name
, &demangled_name1
,
911 kxld_demangle(super_class_name
, &demangled_name2
,
912 &demangled_length2
));
916 /* Patch the class's vtable */
917 rval
= kxld_vtable_patch(vtable
, super_vtable
, kext
->kext
);
920 /* Add the class's vtable to the set of patched vtables */
921 rval
= kxld_dict_insert(patched_vtables
, vtable
->name
, vtable
);
922 require_noerr(rval
, finish
);
924 /* Get the meta vtable name from the class name */
925 rval
= kxld_sym_get_meta_vtable_name_from_class_name(class_name
,
926 vtable_name
, sizeof(vtable_name
));
927 require_noerr(rval
, finish
);
929 /* Get the meta vtable. Whether or not it should exist has already
930 * been tested in create_vtables(), so if it doesn't exist and we're
931 * still running, we can safely skip it.
933 vtable
= kxld_dict_find(&kext
->vtable_index
, vtable_name
);
939 require_action(!vtable
->is_patched
, finish
, rval
=KERN_FAILURE
);
941 /* There is no way to look up a metaclass vtable at runtime, but
942 * we know that every class's metaclass inherits directly from
943 * OSMetaClass, so we just hardcode that vtable name here.
945 len
= strlcpy(super_vtable_name
, kOSMetaClassVTableName
,
946 sizeof(super_vtable_name
));
947 require_action(len
== const_strlen(kOSMetaClassVTableName
),
948 finish
, rval
=KERN_FAILURE
);
950 /* Get the super meta vtable */
951 super_vtable
= kxld_dict_find(patched_vtables
, super_vtable_name
);
952 require_action(super_vtable
&& super_vtable
->is_patched
,
953 finish
, rval
=KERN_FAILURE
);
955 /* Patch the meta class's vtable */
956 rval
= kxld_vtable_patch(vtable
, super_vtable
, kext
->kext
);
957 require_noerr(rval
, finish
);
959 /* Add the MetaClass's vtable to the set of patched vtables */
960 rval
= kxld_dict_insert(patched_vtables
, vtable
->name
, vtable
);
961 require_noerr(rval
, finish
);
969 require_action(!failure
, finish
, rval
=KERN_FAILURE
);
970 failure
= (nprogress
== 0);
975 if (demangled_name1
) kxld_free(demangled_name1
, demangled_length1
);
976 if (demangled_name2
) kxld_free(demangled_name2
, demangled_length2
);
981 /*******************************************************************************
982 *******************************************************************************/
984 create_vtable_index(KXLDKext
*kext
)
986 kern_return_t rval
= KERN_FAILURE
;
987 KXLDVTable
*vtable
= NULL
;
990 if (kext
->vtable_index_created
) {
995 /* Map vtable names to the vtable structures */
996 rval
= kxld_dict_init(&kext
->vtable_index
, kxld_dict_string_hash
,
997 kxld_dict_string_cmp
, kext
->vtables
.nitems
);
998 require_noerr(rval
, finish
);
1000 for (i
= 0; i
< kext
->vtables
.nitems
; ++i
) {
1001 vtable
= kxld_array_get_item(&kext
->vtables
, i
);
1002 rval
= kxld_dict_insert(&kext
->vtable_index
, vtable
->name
, vtable
);
1003 require_noerr(rval
, finish
);
1006 kext
->vtable_index_created
= TRUE
;
1007 rval
= KERN_SUCCESS
;
1012 /*******************************************************************************
1013 *******************************************************************************/
1014 static const KXLDSym
*
1015 get_metaclass_symbol_from_super_meta_class_pointer_symbol(KXLDKext
*kext
,
1016 KXLDSym
*super_metaclass_pointer_sym
)
1018 kern_return_t rval
= KERN_FAILURE
;
1019 const KXLDReloc
*reloc
= NULL
;
1020 const KXLDSect
*sect
= NULL
;
1021 const KXLDSym
*metaclass
= NULL
;
1024 check(super_metaclass_pointer_sym
);
1026 /* Get the relocation entry that fills in the super metaclass pointer. */
1027 reloc
= kxld_object_get_reloc_at_symbol(kext
->kext
,
1028 super_metaclass_pointer_sym
);
1029 require_action(reloc
, finish
, rval
=KERN_FAILURE
);
1031 /* Get the section of the super metaclass pointer. */
1032 sect
= kxld_object_get_section_by_index(kext
->kext
,
1033 super_metaclass_pointer_sym
->sectnum
);
1034 require_action(sect
, finish
, rval
=KERN_FAILURE
);
1036 /* Get the symbol that will be filled into the super metaclass pointer. */
1037 metaclass
= kxld_object_get_symbol_of_reloc(kext
->kext
, reloc
, sect
);
1042 /*******************************************************************************
1043 *******************************************************************************/
1044 static kern_return_t
1045 validate_symbols(KXLDKext
*kext
)
1047 kern_return_t rval
= KERN_FAILURE
;
1048 KXLDSymtabIterator iter
;
1049 KXLDSym
*sym
= NULL
;
1050 u_int error
= FALSE
;
1051 char *demangled_name
= NULL
;
1052 size_t demangled_length
= 0;
1054 /* Check for any unresolved symbols */
1055 kxld_symtab_iterator_init(&iter
, kxld_object_get_symtab(kext
->kext
),
1056 kxld_sym_is_unresolved
, FALSE
);
1057 while ((sym
= kxld_symtab_iterator_get_next(&iter
))) {
1060 kxld_log(kKxldLogLinking
, kKxldLogErr
,
1061 "The following symbols are unresolved for this kext:");
1063 kxld_log(kKxldLogLinking
, kKxldLogErr
, "\t%s",
1064 kxld_demangle(sym
->name
, &demangled_name
, &demangled_length
));
1066 require_noerr_action(error
, finish
, rval
=KERN_FAILURE
);
1068 rval
= KERN_SUCCESS
;
1071 if (demangled_name
) kxld_free(demangled_name
, demangled_length
);