1/* 2 * Copyright (c) 2008 Apple Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 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. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 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. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28#include <string.h> 29#include <mach/vm_param.h> 30#include <mach/vm_types.h> 31#include <mach/kmod.h> 32#include <mach-o/loader.h> 33#include <mach-o/nlist.h> 34#include <mach-o/reloc.h> 35#include <sys/types.h> 36 37#if KERNEL 38 #include <libkern/kernel_mach_header.h> 39 #include <libkern/OSKextLib.h> 40 #include <libkern/OSKextLibPrivate.h> 41 #include <mach/vm_param.h> 42 #include <mach-o/fat.h> 43#else /* !KERNEL */ 44 #include <architecture/byte_order.h> 45 #include <mach/mach_init.h> 46 #include <mach-o/arch.h> 47 #include <mach-o/swap.h> 48#endif /* KERNEL */ 49 50#define DEBUG_ASSERT_COMPONENT_NAME_STRING "kxld" 51#include <AssertMacros.h> 52 53#include "kxld_demangle.h" 54#include "kxld_dict.h" 55#include "kxld_kext.h" 56#include "kxld_object.h" 57#include "kxld_reloc.h" 58#include "kxld_sect.h" 59#include "kxld_seg.h" 60#include "kxld_symtab.h" 61#include "kxld_util.h" 62#include "kxld_vtable.h" 63 64struct symtab_command; 65 66struct kxld_kext { 67 KXLDObject *kext; 68 KXLDObject *interface; 69 KXLDArray vtables; 70 KXLDDict vtable_index; 71 boolean_t vtables_created; 72 boolean_t vtable_index_created; 73}; 74 75/******************************************************************************* 76* Prototypes 77*******************************************************************************/ 78 79static kern_return_t export_symbols_through_interface( 80 const KXLDObject *kext, const KXLDObject *interface, 81 KXLDDict *defined_symbols_by_name, 82 KXLDDict *defined_cxx_symbol_by_value, 83 KXLDDict *obsolete_symbols_by_name); 84static kern_return_t export_symbols(const KXLDObject *kext, 85 KXLDDict *defined_symbols_by_name, 86 KXLDDict *defined_cxx_symbols_by_value); 87 88static kern_return_t create_vtables(KXLDKext *kext, 89 const KXLDDict *defined_symbols, const KXLDDict *defined_cxx_symbols); 90static kern_return_t get_vtable_syms_from_smcp(KXLDKext *kext, 91 const KXLDDict *defined_symbols, KXLDSym *super_metaclass_ptr_sym, 92 KXLDSym **vtable_sym_out, KXLDSym **meta_vtable_sym_out); 93 94static kern_return_t resolve_symbols(KXLDKext *kext, 95 const KXLDDict *defined_symbols, const KXLDDict *obsolete_symbols); 96 97static kern_return_t patch_vtables(KXLDKext *kext, KXLDDict *patched_vtables, 98 const KXLDDict *defined_symbols); 99static const KXLDSym *get_metaclass_symbol_from_super_meta_class_pointer_symbol( 100 KXLDKext *kext, KXLDSym *super_metaclass_pointer_sym); 101static kern_return_t create_vtable_index(KXLDKext *kext); 102 103static kern_return_t validate_symbols(KXLDKext *kext); 104 105/******************************************************************************* 106*******************************************************************************/ 107size_t 108kxld_kext_sizeof(void) 109{ 110 return sizeof(KXLDKext); 111} 112 113/******************************************************************************* 114*******************************************************************************/ 115kern_return_t 116kxld_kext_init(KXLDKext *kext, KXLDObject *kext_object, 117 KXLDObject *interface_object) 118{ 119 kern_return_t rval = KERN_FAILURE; 120 121 check(kext); 122 check(kext_object); 123 124 kext->kext = kext_object; 125 126 if (interface_object) { 127 kext->interface = interface_object; 128 129 rval = kxld_object_index_symbols_by_name(kext->kext); 130 require_noerr(rval, finish); 131 } 132 133 rval = KERN_SUCCESS; 134finish: 135 return rval; 136} 137 138/******************************************************************************* 139*******************************************************************************/ 140void 141kxld_kext_clear(KXLDKext *kext) 142{ 143 KXLDVTable *vtable = NULL; 144 u_int i; 145 146 check(kext); 147 148 for (i = 0; i < kext->vtables.nitems; ++i) { 149 vtable = kxld_array_get_item(&kext->vtables, i); 150 kxld_vtable_clear(vtable); 151 } 152 kxld_array_reset(&kext->vtables); 153 kxld_dict_clear(&kext->vtable_index); 154 155 kext->kext = NULL; 156 kext->interface = NULL; 157 kext->vtables_created = FALSE; 158 kext->vtable_index_created = FALSE; 159} 160 161 162/******************************************************************************* 163*******************************************************************************/ 164void 165kxld_kext_deinit(KXLDKext *kext) 166{ 167 KXLDVTable *vtable = NULL; 168 u_int i; 169 170 check(kext); 171 172 for (i = 0; i < kext->vtables.maxitems; ++i) { 173 vtable = kxld_array_get_slot(&kext->vtables, i); 174 kxld_vtable_deinit(vtable); 175 } 176 kxld_array_deinit(&kext->vtables); 177 kxld_dict_deinit(&kext->vtable_index); 178 179 bzero(kext, sizeof(*kext)); 180} 181 182/******************************************************************************* 183*******************************************************************************/ 184kern_return_t 185kxld_kext_export_symbols(const KXLDKext *kext, 186 KXLDDict *defined_symbols_by_name, 187 KXLDDict *obsolete_symbols_by_name, 188 KXLDDict *defined_cxx_symbols_by_value) 189{ 190 kern_return_t rval = KERN_FAILURE; 191 192 check(kext); 193 194 if (kext->interface) { 195 rval = export_symbols_through_interface(kext->kext, kext->interface, 196 defined_symbols_by_name, obsolete_symbols_by_name, 197 defined_cxx_symbols_by_value); 198 require_noerr(rval, finish); 199 } else { 200 rval = export_symbols(kext->kext, defined_symbols_by_name, 201 defined_cxx_symbols_by_value); 202 require_noerr(rval, finish); 203 } 204 205 rval = KERN_SUCCESS; 206finish: 207 return rval; 208} 209 210/******************************************************************************* 211*******************************************************************************/ 212kern_return_t 213export_symbols_through_interface(const KXLDObject *kext, 214 const KXLDObject *interface, KXLDDict *defined_symbols_by_name, 215 KXLDDict *obsolete_symbols_by_name, KXLDDict *defined_cxx_symbols_by_value) 216{ 217 kern_return_t rval = KERN_FAILURE; 218 KXLDSymtabIterator iter; 219 const KXLDSymtab *kext_symtab = NULL; 220 const KXLDSymtab *interface_symtab = NULL; 221 KXLDSym *kext_sym = NULL; 222 const KXLDSym *interface_sym = NULL; 223 224 check(kext); 225 check(interface); 226 227 kext_symtab = kxld_object_get_symtab(kext); 228 interface_symtab = kxld_object_get_symtab(interface); 229 230 if (defined_symbols_by_name) { 231 /* Add exported symbols */ 232 (void) kxld_symtab_iterator_init(&iter, interface_symtab, 233 kxld_sym_is_undefined, FALSE); 234 while ((interface_sym = kxld_symtab_iterator_get_next(&iter))) { 235 kext_sym = kxld_symtab_get_locally_defined_symbol_by_name(kext_symtab, 236 interface_sym->name); 237 if (!kext_sym) { 238 kxld_log(kKxldLogLinking, kKxldLogWarn, 239 "In interface %s of %s, couldn't find symbol %s\n", 240 kxld_object_get_name(interface), kxld_object_get_name(kext), 241 interface_sym->name); 242 continue; 243 } 244 245 rval = kxld_dict_insert(defined_symbols_by_name, 246 kext_sym->name, kext_sym); 247 require_noerr(rval, finish); 248 } 249 250 /* Add indirect symbols */ 251 (void) kxld_symtab_iterator_init(&iter, interface_symtab, 252 kxld_sym_is_indirect, FALSE); 253 while ((interface_sym = kxld_symtab_iterator_get_next(&iter))) { 254 kext_sym = kxld_symtab_get_locally_defined_symbol_by_name(kext_symtab, 255 interface_sym->alias); 256 if (!kext_sym) { 257 kxld_log(kKxldLogLinking, kKxldLogWarn, 258 "In interface %s of %s, couldn't find indirect symbol %s (%s)\n", 259 kxld_object_get_name(interface), kxld_object_get_name(kext), 260 interface_sym->alias, interface_sym->name); 261 continue; 262 } 263 264 rval = kxld_dict_insert(defined_symbols_by_name, 265 interface_sym->name, kext_sym); 266 require_noerr(rval, finish); 267 } 268 } 269 270 /* Add obsolete symbols */ 271 if (obsolete_symbols_by_name) { 272 (void) kxld_symtab_iterator_init(&iter, interface_symtab, 273 kxld_sym_is_obsolete, FALSE); 274 while ((kext_sym = kxld_symtab_iterator_get_next(&iter))) { 275 rval = kxld_dict_insert(obsolete_symbols_by_name, 276 kext_sym->name, kext_sym); 277 require_noerr(rval, finish); 278 } 279 } 280 281 /* Add C++ symbols */ 282 if (defined_cxx_symbols_by_value) { 283 (void) kxld_symtab_iterator_init(&iter, kext_symtab, 284 kxld_sym_is_cxx, FALSE); 285 while ((kext_sym = kxld_symtab_iterator_get_next(&iter))) { 286 rval = kxld_dict_insert(defined_cxx_symbols_by_value, 287 &kext_sym->link_addr, kext_sym); 288 require_noerr(rval, finish); 289 } 290 } 291 292 rval = KERN_SUCCESS; 293finish: 294 return rval; 295} 296 297/******************************************************************************* 298*******************************************************************************/ 299kern_return_t 300export_symbols(const KXLDObject *kext, KXLDDict *defined_symbols_by_name, 301 KXLDDict *defined_cxx_symbols_by_value) 302{ 303 kern_return_t rval = KERN_FAILURE; 304 KXLDSymtabIterator iter; 305 KXLDSym *sym = NULL; 306 307 (void) kxld_symtab_iterator_init(&iter, kxld_object_get_symtab(kext), 308 kxld_sym_is_exported, FALSE); 309 while ((sym = kxld_symtab_iterator_get_next(&iter))) { 310 if (defined_symbols_by_name) { 311 rval = kxld_dict_insert(defined_symbols_by_name, sym->name, sym); 312 require_noerr(rval, finish); 313 } 314 315 if (kxld_sym_is_cxx(sym) && defined_cxx_symbols_by_value) { 316 rval = kxld_dict_insert(defined_cxx_symbols_by_value, 317 &sym->link_addr, sym); 318 require_noerr(rval, finish); 319 } 320 } 321 322 rval = KERN_SUCCESS; 323finish: 324 return rval; 325} 326 327/******************************************************************************* 328*******************************************************************************/ 329kern_return_t 330kxld_kext_export_vtables(KXLDKext *kext, const KXLDDict *defined_cxx_symbols, 331 const KXLDDict *defined_symbols, KXLDDict *vtables) 332{ 333 kern_return_t rval = KERN_FAILURE; 334 KXLDVTable *vtable = NULL; 335 u_int i = 0; 336 337 check(kext); 338 check(defined_symbols); 339 check(defined_cxx_symbols); 340 check(vtables); 341 342 rval = create_vtables(kext, defined_cxx_symbols, defined_symbols); 343 require_noerr(rval, finish); 344 345 for (i = 0; i < kext->vtables.nitems; ++i) { 346 vtable = kxld_array_get_item(&kext->vtables, i); 347 348 rval = kxld_dict_insert(vtables, vtable->name, vtable); 349 require_noerr(rval, finish); 350 } 351 352 rval = KERN_SUCCESS; 353finish: 354 return rval; 355} 356 357/******************************************************************************* 358*******************************************************************************/ 359void 360kxld_kext_get_vmsize(const KXLDKext *kext, 361 u_long *header_size, u_long *vmsize) 362{ 363 (void) kxld_object_get_vmsize(kext->kext, header_size, vmsize); 364} 365 366/******************************************************************************* 367 *******************************************************************************/ 368void 369kxld_kext_set_linked_object_size(KXLDKext *kext, u_long vmsize) 370{ 371 (void) kxld_object_set_linked_object_size(kext->kext, vmsize); 372} 373 374 375/******************************************************************************* 376*******************************************************************************/ 377kern_return_t 378kxld_kext_export_linked_object(const KXLDKext *kext, 379 u_char *linked_object, kxld_addr_t *kmod_info) 380{ 381 kern_return_t rval = KERN_FAILURE; 382 const KXLDSym *kmodsym = NULL; 383 384 kmodsym = kxld_symtab_get_locally_defined_symbol_by_name( 385 kxld_object_get_symtab(kext->kext), KXLD_KMOD_INFO_SYMBOL); 386 require_action(kmodsym, finish, rval=KERN_FAILURE; 387 kxld_log(kKxldLogLinking, kKxldLogErr, kKxldLogNoKmodInfo)); 388 389 *kmod_info = kmodsym->link_addr; 390 391 rval = kxld_object_export_linked_object(kext->kext, linked_object); 392finish: 393 return rval; 394} 395 396/******************************************************************************* 397*******************************************************************************/ 398kern_return_t 399kxld_kext_relocate(KXLDKext *kext, kxld_addr_t link_address, 400 KXLDDict *patched_vtables, const KXLDDict *defined_symbols, 401 const KXLDDict *obsolete_symbols, const KXLDDict *defined_cxx_symbols) 402{ 403 kern_return_t rval = KERN_FAILURE; 404 405 check(kext); 406 check(patched_vtables); 407 check(defined_symbols); 408 check(obsolete_symbols); 409 410 /* Kexts that are being relocated need symbols indexed by value for vtable 411 * creation and patching. Note that we don't need to index by value for 412 * dependencies that have already been linked because their symbols are 413 * already in the global cxx value table. It's important to index the 414 * symbols by value before we relocate the symbols because the vtable 415 * entries will still have unrelocated values. 416 */ 417 rval = kxld_object_index_cxx_symbols_by_value(kext->kext); 418 require_noerr(rval, finish); 419 420 rval = kxld_object_index_symbols_by_name(kext->kext); 421 require_noerr(rval, finish); 422 423 rval = kxld_object_relocate(kext->kext, link_address); 424 require_noerr(rval, finish); 425 426 rval = resolve_symbols(kext, defined_symbols, obsolete_symbols); 427 require_noerr(rval, finish); 428 429 rval = create_vtables(kext, defined_cxx_symbols, /* defined_symbols */ NULL); 430 require_noerr(rval, finish); 431 432 rval = patch_vtables(kext, patched_vtables, defined_symbols); 433 require_noerr(rval, finish); 434 435 rval = validate_symbols(kext); 436 require_noerr(rval, finish); 437 438 rval = kxld_object_process_relocations(kext->kext, patched_vtables); 439 require_noerr(rval, finish); 440 441 rval = KERN_SUCCESS; 442finish: 443 return rval; 444} 445 446/******************************************************************************* 447* The defined symbols argument is optional. When supplied, create_vtables() 448* will look for vtable symbols in the defined_symbols dictionary. Otherwise, 449* it will look in the kext's symbol table for vtable symbols. 450* 451* We do this because there are two types of KXLDKext objects that call 452* create_vtables(), those that have been linked, and those that haven't. The 453* linked kexts export their symbols into the global symbol table that is used 454* for symbol resolution, so we can look there for vtable symbols without 455* having to index their local symbol table separately. 456* 457* Unlinked kexts haven't yet had their symbols exported into the global table, 458* so we have to index their local symbol table separately. 459*******************************************************************************/ 460static kern_return_t 461create_vtables(KXLDKext *kext, const KXLDDict *defined_cxx_symbols, 462 const KXLDDict *defined_symbols) 463{ 464 kern_return_t rval = KERN_FAILURE; 465 const KXLDSymtab *symtab = NULL; 466 KXLDSymtabIterator iter; 467 KXLDSym *sym = NULL; 468 KXLDSym *vtable_sym = NULL; 469 KXLDSym *meta_vtable_sym = NULL; 470 KXLDVTable *vtable = NULL; 471 KXLDVTable *meta_vtable = NULL; 472 u_int i = 0; 473 u_int nvtables = 0; 474 475 if (kext->vtables_created) { 476 rval = KERN_SUCCESS; 477 goto finish; 478 } 479 480 symtab = kxld_object_get_symtab(kext->kext); 481 482 if (kxld_object_is_linked(kext->kext)) { 483 /* Create a vtable object for every vtable symbol */ 484 kxld_symtab_iterator_init(&iter, symtab, kxld_sym_is_vtable, FALSE); 485 nvtables = kxld_symtab_iterator_get_num_remaining(&iter); 486 } else { 487 /* We walk over the super metaclass pointer symbols because classes 488 * with them are the only ones that need patching. Then we double the 489 * number of vtables we're expecting, because every pointer will have a 490 * class vtable and a MetaClass vtable. 491 */ 492 kxld_symtab_iterator_init(&iter, symtab, 493 kxld_sym_is_super_metaclass_pointer, FALSE); 494 nvtables = kxld_symtab_iterator_get_num_remaining(&iter) * 2; 495 } 496 497 rval = kxld_array_init(&kext->vtables, sizeof(KXLDVTable), nvtables); 498 require_noerr(rval, finish); 499 500 while ((sym = kxld_symtab_iterator_get_next(&iter))) { 501 if (kxld_object_is_linked(kext->kext)) { 502 vtable_sym = sym; 503 meta_vtable_sym = NULL; 504 meta_vtable = NULL; 505 } else { 506 rval = get_vtable_syms_from_smcp(kext, defined_symbols, sym, 507 &vtable_sym, &meta_vtable_sym); 508 require_noerr(rval, finish); 509 } 510 511 vtable = kxld_array_get_item(&kext->vtables, i++); 512 rval = kxld_vtable_init(vtable, vtable_sym, kext->kext, 513 defined_cxx_symbols); 514 require_noerr(rval, finish); 515 516 /* meta_vtable_sym will be null when we don't support strict 517 * patching and can't find the metaclass vtable. If that's the 518 * case, we just reduce the expect number of vtables by 1. 519 */ 520 if (!kxld_object_is_linked(kext->kext)) { 521 if (meta_vtable_sym) { 522 meta_vtable = kxld_array_get_item(&kext->vtables, i++); 523 rval = kxld_vtable_init(meta_vtable, meta_vtable_sym, 524 kext->kext, defined_cxx_symbols); 525 require_noerr(rval, finish); 526 } else { 527 kxld_array_resize(&kext->vtables, --nvtables); 528 meta_vtable = NULL; 529 } 530 } 531 } 532 require_action(i == kext->vtables.nitems, finish, 533 rval=KERN_FAILURE); 534 535 kext->vtables_created = TRUE; 536 rval = KERN_SUCCESS; 537finish: 538 return rval; 539} 540 541/******************************************************************************* 542*******************************************************************************/ 543static kern_return_t 544get_vtable_syms_from_smcp(KXLDKext *kext, const KXLDDict *defined_symbols, 545 KXLDSym *super_metaclass_ptr_sym, KXLDSym **vtable_sym_out, 546 KXLDSym **meta_vtable_sym_out) 547{ 548 kern_return_t rval = KERN_FAILURE; 549 const KXLDSymtab *symtab = NULL; 550 KXLDSym *vtable_sym = NULL; 551 KXLDSym *meta_vtable_sym = NULL; 552 char class_name[KXLD_MAX_NAME_LEN]; 553 char vtable_name[KXLD_MAX_NAME_LEN]; 554 char meta_vtable_name[KXLD_MAX_NAME_LEN]; 555 char *demangled_name1 = NULL; 556 char *demangled_name2 = NULL; 557 size_t demangled_length1 = 0; 558 size_t demangled_length2 = 0; 559 560 check(kext); 561 check(vtable_sym_out); 562 check(meta_vtable_sym_out); 563 564 require(!kxld_object_is_kernel(kext->kext), finish); 565 566 symtab = kxld_object_get_symtab(kext->kext); 567 568 /* Get the class name from the smc pointer */ 569 rval = kxld_sym_get_class_name_from_super_metaclass_pointer( 570 super_metaclass_ptr_sym, class_name, sizeof(class_name)); 571 require_noerr(rval, finish); 572 573 /* Get the vtable name from the class name */ 574 rval = kxld_sym_get_vtable_name_from_class_name(class_name, 575 vtable_name, sizeof(vtable_name)); 576 require_noerr(rval, finish); 577 578 /* Get the vtable symbol */ 579 if (defined_symbols) { 580 vtable_sym = kxld_dict_find(defined_symbols, vtable_name); 581 } else { 582 vtable_sym = kxld_symtab_get_locally_defined_symbol_by_name(symtab, 583 vtable_name); 584 } 585 require_action(vtable_sym, finish, rval=KERN_FAILURE; 586 kxld_log(kKxldLogPatching, kKxldLogErr, kKxldLogMissingVtable, 587 vtable_name, class_name)); 588 589 /* Get the meta vtable name from the class name */ 590 rval = kxld_sym_get_meta_vtable_name_from_class_name(class_name, 591 meta_vtable_name, sizeof(meta_vtable_name)); 592 require_noerr(rval, finish); 593 594 /* Get the meta vtable symbol */ 595 if (defined_symbols) { 596 meta_vtable_sym = kxld_dict_find(defined_symbols, meta_vtable_name); 597 } else { 598 meta_vtable_sym = kxld_symtab_get_locally_defined_symbol_by_name(symtab, 599 meta_vtable_name); 600 } 601 if (!meta_vtable_sym) { 602 if (kxld_object_target_supports_strict_patching(kext->kext)) { 603 kxld_log(kKxldLogPatching, kKxldLogErr, 604 kKxldLogMissingVtable, 605 meta_vtable_name, class_name); 606 rval = KERN_FAILURE; 607 goto finish; 608 } else { 609 kxld_log(kKxldLogPatching, kKxldLogErr, 610 "Warning: " kKxldLogMissingVtable, 611 kxld_demangle(meta_vtable_name, &demangled_name1, 612 &demangled_length1), 613 kxld_demangle(class_name, &demangled_name2, 614 &demangled_length2)); 615 } 616 } 617 618 *vtable_sym_out = vtable_sym; 619 *meta_vtable_sym_out = meta_vtable_sym; 620 rval = KERN_SUCCESS; 621finish: 622 if (demangled_name1) kxld_free(demangled_name1, demangled_length1); 623 if (demangled_name2) kxld_free(demangled_name2, demangled_length2); 624 625 return rval; 626} 627 628/******************************************************************************* 629*******************************************************************************/ 630static kern_return_t 631resolve_symbols(KXLDKext *kext, const KXLDDict *defined_symbols, 632 const KXLDDict *obsolete_symbols) 633{ 634 kern_return_t rval = KERN_FAILURE; 635 const KXLDSymtab *symtab = NULL; 636 KXLDSymtabIterator iter; 637 KXLDSym *sym = NULL; 638 KXLDSym *defined_sym = NULL; 639 const char *name = NULL; 640 boolean_t tests_for_weak = FALSE; 641 boolean_t error = FALSE; 642 char *demangled_name = NULL; 643 size_t demangled_length = 0; 644 645 check(kext->kext); 646 check(defined_symbols); 647 check(obsolete_symbols); 648 649 symtab = kxld_object_get_symtab(kext->kext); 650 651 /* Check if the kext tests for weak symbols */ 652 sym = kxld_symtab_get_symbol_by_name(symtab, KXLD_WEAK_TEST_SYMBOL); 653 tests_for_weak = (sym != NULL); 654 655 /* Check for duplicate symbols */ 656 kxld_symtab_iterator_init(&iter, symtab, kxld_sym_is_exported, FALSE); 657 while ((sym = kxld_symtab_iterator_get_next(&iter))) { 658 defined_sym = kxld_dict_find(defined_symbols, sym->name); 659 if (defined_sym) { 660 /* Not a problem if the symbols have the same address */ 661 if (defined_sym->link_addr == sym->link_addr) { 662 continue; 663 } 664 665 if (!error) { 666 error = TRUE; 667 kxld_log(kKxldLogLinking, kKxldLogErr, 668 "The following symbols were defined more than once:"); 669 } 670 671 kxld_log(kKxldLogLinking, kKxldLogErr, "\t%s: %p - %p", 672 kxld_demangle(sym->name, &demangled_name, &demangled_length), 673 (void *) (uintptr_t) sym->link_addr, 674 (void *) (uintptr_t) defined_sym->link_addr); 675 } 676 } 677 require_noerr_action(error, finish, rval=KERN_FAILURE); 678 679 /* Resolve undefined and indirect symbols */ 680 681 /* Iterate over all unresolved symbols */ 682 kxld_symtab_iterator_init(&iter, symtab, 683 kxld_sym_is_unresolved, FALSE); 684 while ((sym = kxld_symtab_iterator_get_next(&iter))) { 685 686 /* Common symbols are not supported */ 687 if (kxld_sym_is_common(sym)) { 688 689 if (!error) { 690 error = TRUE; 691 if (kxld_object_target_supports_common_symbols(kext->kext)) { 692 kxld_log(kKxldLogLinking, kKxldLogErr, 693 "The following common symbols were not resolved:"); 694 } else { 695 kxld_log(kKxldLogLinking, kKxldLogErr, 696 "Common symbols are not supported in kernel extensions. " 697 "Use -fno-common to build your kext. " 698 "The following are common symbols:"); 699 } 700 } 701 kxld_log(kKxldLogLinking, kKxldLogErr, "\t%s", 702 kxld_demangle(sym->name, &demangled_name, &demangled_length)); 703 704 } else { 705 706 /* Find the address of the defined symbol */ 707 if (kxld_sym_is_undefined(sym)) { 708 name = sym->name; 709 } else { 710 name = sym->alias; 711 } 712 defined_sym = kxld_dict_find(defined_symbols, name); 713 714 /* Resolve the symbol. If a definition cannot be found, then: 715 * 1) Psuedokexts log a warning and proceed 716 * 2) Actual kexts delay the error until validation in case vtable 717 * patching replaces the undefined symbol. 718 */ 719 720 if (defined_sym) { 721 722 rval = kxld_sym_resolve(sym, defined_sym->link_addr); 723 require_noerr(rval, finish); 724 725 if (obsolete_symbols && kxld_dict_find(obsolete_symbols, name)) { 726 kxld_log(kKxldLogLinking, kKxldLogWarn, 727 "This kext uses obsolete symbol %s.", 728 kxld_demangle(name, &demangled_name, &demangled_length)); 729 } 730 731 } else if (kxld_sym_is_weak(sym)) { 732 kxld_addr_t addr = 0; 733 734 /* Make sure that the kext has referenced gOSKextUnresolved. 735 */ 736 require_action(tests_for_weak, finish, 737 rval=KERN_FAILURE; 738 kxld_log(kKxldLogLinking, kKxldLogErr, 739 "This kext has weak references but does not test for " 740 "them. Test for weak references with " 741 "OSKextIsSymbolResolved().")); 742 743#if KERNEL 744 /* Get the address of the default weak address. 745 */ 746 addr = (kxld_addr_t) &kext_weak_symbol_referenced; 747#else 748 /* This is run during symbol generation only, so we only 749 * need a filler value here. 750 */ 751 addr = 0xF00DD00D; 752#endif /* KERNEL */ 753 754 rval = kxld_sym_resolve(sym, addr); 755 require_noerr(rval, finish); 756 } 757 } 758 } 759 require_noerr_action(error, finish, rval=KERN_FAILURE); 760 761 rval = KERN_SUCCESS; 762 763finish: 764 if (demangled_name) kxld_free(demangled_name, demangled_length); 765 766 return rval; 767} 768 769/******************************************************************************* 770* We must patch vtables to ensure binary compatibility, and to perform that 771* patching, we have to determine the vtables' inheritance relationships. The 772* MetaClass system gives us a way to do that: 773* 1) Iterate over all of the super MetaClass pointer symbols. Every class 774* that inherits from OSObject will have a pointer in its MetaClass that 775* points to the MetaClass's super MetaClass. 776* 2) Derive the name of the class from the super MetaClass pointer. 777* 3) Derive the name of the class's vtable from the name of the class 778* 4) Follow the super MetaClass pointer to get the address of the super 779* MetaClass's symbol 780* 5) Look up the super MetaClass symbol by address 781* 6) Derive the super class's name from the super MetaClass name 782* 7) Derive the super class's vtable from the super class's name 783* This procedure will allow us to find all of the OSObject-derived classes and 784* their super classes, and thus patch all of the vtables. 785* 786* We also have to take care to patch up the MetaClass's vtables. The 787* MetaClasses follow a parallel hierarchy to the classes, so once we have the 788* class name and super class name, we can also derive the MetaClass name and 789* the super MetaClass name, and thus find and patch their vtables as well. 790*******************************************************************************/ 791 792#define kOSMetaClassVTableName "__ZTV11OSMetaClass" 793 794static kern_return_t 795patch_vtables(KXLDKext *kext, KXLDDict *patched_vtables, 796 const KXLDDict *defined_symbols) 797{ 798 kern_return_t rval = KERN_FAILURE; 799 KXLDSymtabIterator iter; 800 const KXLDSymtab *symtab = NULL; 801 const KXLDSym *metaclass = NULL; 802 KXLDSym *super_metaclass_pointer = NULL; 803 KXLDSym *final_sym = NULL; 804 KXLDVTable *vtable = NULL; 805 KXLDVTable *super_vtable = NULL; 806 char class_name[KXLD_MAX_NAME_LEN]; 807 char super_class_name[KXLD_MAX_NAME_LEN]; 808 char vtable_name[KXLD_MAX_NAME_LEN]; 809 char super_vtable_name[KXLD_MAX_NAME_LEN]; 810 char final_sym_name[KXLD_MAX_NAME_LEN]; 811 char *demangled_name1 = NULL; 812 char *demangled_name2 = NULL; 813 size_t demangled_length1 = 0;; 814 size_t demangled_length2 = 0; 815 size_t len = 0; 816 u_int nvtables = 0; 817 u_int npatched = 0; 818 u_int nprogress = 0; 819 boolean_t failure = FALSE; 820 821 check(kext); 822 check(patched_vtables); 823 824 symtab = kxld_object_get_symtab(kext->kext); 825 826 rval = create_vtable_index(kext); 827 require_noerr(rval, finish); 828 829 /* Find each super meta class pointer symbol */ 830 831 kxld_symtab_iterator_init(&iter, symtab, 832 kxld_sym_is_super_metaclass_pointer, FALSE); 833 nvtables = kxld_symtab_iterator_get_num_remaining(&iter); 834 835 while (npatched < nvtables) { 836 npatched = 0; 837 nprogress = 0; 838 kxld_symtab_iterator_reset(&iter); 839 while((super_metaclass_pointer = kxld_symtab_iterator_get_next(&iter))) 840 { 841 /* Get the class name from the smc pointer */ 842 rval = kxld_sym_get_class_name_from_super_metaclass_pointer( 843 super_metaclass_pointer, class_name, sizeof(class_name)); 844 require_noerr(rval, finish); 845 846 /* Get the vtable name from the class name */ 847 rval = kxld_sym_get_vtable_name_from_class_name(class_name, 848 vtable_name, sizeof(vtable_name)); 849 require_noerr(rval, finish); 850 851 /* Get the vtable and make sure it hasn't been patched */ 852 vtable = kxld_dict_find(&kext->vtable_index, vtable_name); 853 require_action(vtable, finish, rval=KERN_FAILURE; 854 kxld_log(kKxldLogPatching, kKxldLogErr, kKxldLogMissingVtable, 855 vtable_name, class_name)); 856 857 if (!vtable->is_patched) { 858 859 /* Find the SMCP's meta class symbol */ 860 metaclass = get_metaclass_symbol_from_super_meta_class_pointer_symbol( 861 kext, super_metaclass_pointer); 862 require_action(metaclass, finish, rval=KERN_FAILURE); 863 864 /* Get the super class name from the super metaclass */ 865 rval = kxld_sym_get_class_name_from_metaclass(metaclass, 866 super_class_name, sizeof(super_class_name)); 867 require_noerr(rval, finish); 868 869 /* Get the super vtable name from the class name */ 870 rval = kxld_sym_get_vtable_name_from_class_name(super_class_name, 871 super_vtable_name, sizeof(super_vtable_name)); 872 require_noerr(rval, finish); 873 874 /* Get the super vtable if it's been patched */ 875 super_vtable = kxld_dict_find(patched_vtables, super_vtable_name); 876 877 if (failure) { 878 const KXLDVTable *unpatched_super_vtable; 879 unpatched_super_vtable = kxld_dict_find(&kext->vtable_index, 880 super_vtable_name); 881 882 /* If the parent's vtable hasn't been patched, warn that 883 * this vtable is unpatchable because of the parent. 884 */ 885 if (!super_vtable) { 886 kxld_log(kKxldLogPatching, kKxldLogErr, 887 "The %s was not patched because its parent, " 888 "the %s, was not %s.", 889 kxld_demangle(vtable_name, &demangled_name1, 890 &demangled_length1), 891 kxld_demangle(super_vtable_name, &demangled_name2, 892 &demangled_length2), 893 (unpatched_super_vtable) ? "patchable" : "found"); 894 } 895 continue; 896 } 897 898 if (!super_vtable) continue; 899 900 /* Get the final symbol's name from the super vtable */ 901 rval = kxld_sym_get_final_sym_name_from_class_name(super_class_name, 902 final_sym_name, sizeof(final_sym_name)); 903 require_noerr(rval, finish); 904 905 /* Verify that the final symbol does not exist. First check 906 * all the externally defined symbols, then check locally. 907 */ 908 final_sym = kxld_dict_find(defined_symbols, final_sym_name); 909 if (!final_sym) { 910 final_sym = kxld_symtab_get_locally_defined_symbol_by_name( 911 symtab, final_sym_name); 912 } 913 if (final_sym) { 914 kxld_log(kKxldLogPatching, kKxldLogErr, 915 "Class '%s' is a subclass of final class '%s'.", 916 kxld_demangle(class_name, &demangled_name1, 917 &demangled_length1), 918 kxld_demangle(super_class_name, &demangled_name2, 919 &demangled_length2)); 920 continue; 921 } 922 923 /* Patch the class's vtable */ 924 rval = kxld_vtable_patch(vtable, super_vtable, kext->kext); 925 if (rval) continue; 926 927 /* Add the class's vtable to the set of patched vtables */ 928 rval = kxld_dict_insert(patched_vtables, vtable->name, vtable); 929 require_noerr(rval, finish); 930 931 /* Get the meta vtable name from the class name */ 932 rval = kxld_sym_get_meta_vtable_name_from_class_name(class_name, 933 vtable_name, sizeof(vtable_name)); 934 require_noerr(rval, finish); 935 936 /* Get the meta vtable. Whether or not it should exist has already 937 * been tested in create_vtables(), so if it doesn't exist and we're 938 * still running, we can safely skip it. 939 */ 940 vtable = kxld_dict_find(&kext->vtable_index, vtable_name); 941 if (!vtable) { 942 ++nprogress; 943 ++npatched; 944 continue; 945 } 946 require_action(!vtable->is_patched, finish, rval=KERN_FAILURE); 947 948 /* There is no way to look up a metaclass vtable at runtime, but 949 * we know that every class's metaclass inherits directly from 950 * OSMetaClass, so we just hardcode that vtable name here. 951 */ 952 len = strlcpy(super_vtable_name, kOSMetaClassVTableName, 953 sizeof(super_vtable_name)); 954 require_action(len == const_strlen(kOSMetaClassVTableName), 955 finish, rval=KERN_FAILURE); 956 957 /* Get the super meta vtable */ 958 super_vtable = kxld_dict_find(patched_vtables, super_vtable_name); 959 require_action(super_vtable && super_vtable->is_patched, 960 finish, rval=KERN_FAILURE); 961 962 /* Patch the meta class's vtable */ 963 rval = kxld_vtable_patch(vtable, super_vtable, kext->kext); 964 require_noerr(rval, finish); 965 966 /* Add the MetaClass's vtable to the set of patched vtables */ 967 rval = kxld_dict_insert(patched_vtables, vtable->name, vtable); 968 require_noerr(rval, finish); 969 970 ++nprogress; 971 } 972 973 ++npatched; 974 } 975 976 require_action(!failure, finish, rval=KERN_FAILURE); 977 failure = (nprogress == 0); 978 } 979 980 rval = KERN_SUCCESS; 981finish: 982 if (demangled_name1) kxld_free(demangled_name1, demangled_length1); 983 if (demangled_name2) kxld_free(demangled_name2, demangled_length2); 984 985 return rval; 986} 987 988/******************************************************************************* 989*******************************************************************************/ 990static kern_return_t 991create_vtable_index(KXLDKext *kext) 992{ 993 kern_return_t rval = KERN_FAILURE; 994 KXLDVTable *vtable = NULL; 995 u_int i = 0; 996 997 if (kext->vtable_index_created) { 998 rval = KERN_SUCCESS; 999 goto finish; 1000 } 1001 1002 /* Map vtable names to the vtable structures */ 1003 rval = kxld_dict_init(&kext->vtable_index, kxld_dict_string_hash, 1004 kxld_dict_string_cmp, kext->vtables.nitems); 1005 require_noerr(rval, finish); 1006 1007 for (i = 0; i < kext->vtables.nitems; ++i) { 1008 vtable = kxld_array_get_item(&kext->vtables, i); 1009 rval = kxld_dict_insert(&kext->vtable_index, vtable->name, vtable); 1010 require_noerr(rval, finish); 1011 } 1012 1013 kext->vtable_index_created = TRUE; 1014 rval = KERN_SUCCESS; 1015finish: 1016 return rval; 1017} 1018 1019/******************************************************************************* 1020*******************************************************************************/ 1021static const KXLDSym * 1022get_metaclass_symbol_from_super_meta_class_pointer_symbol(KXLDKext *kext, 1023 KXLDSym *super_metaclass_pointer_sym) 1024{ 1025 kern_return_t rval = KERN_FAILURE; 1026 const KXLDReloc *reloc = NULL; 1027 const KXLDSect *sect = NULL; 1028 const KXLDSym *metaclass = NULL; 1029 1030 check(kext); 1031 check(super_metaclass_pointer_sym); 1032 1033 /* Get the relocation entry that fills in the super metaclass pointer. */ 1034 reloc = kxld_object_get_reloc_at_symbol(kext->kext, 1035 super_metaclass_pointer_sym); 1036 require_action(reloc, finish, rval=KERN_FAILURE); 1037 1038 /* Get the section of the super metaclass pointer. */ 1039 sect = kxld_object_get_section_by_index(kext->kext, 1040 super_metaclass_pointer_sym->sectnum); 1041 require_action(sect, finish, rval=KERN_FAILURE); 1042 1043 /* Get the symbol that will be filled into the super metaclass pointer. */ 1044 metaclass = kxld_object_get_symbol_of_reloc(kext->kext, reloc, sect); 1045finish: 1046 return metaclass; 1047} 1048 1049/******************************************************************************* 1050*******************************************************************************/ 1051static kern_return_t 1052validate_symbols(KXLDKext *kext) 1053{ 1054 kern_return_t rval = KERN_FAILURE; 1055 KXLDSymtabIterator iter; 1056 KXLDSym *sym = NULL; 1057 u_int error = FALSE; 1058 char *demangled_name = NULL; 1059 size_t demangled_length = 0; 1060 1061 /* Check for any unresolved symbols */ 1062 kxld_symtab_iterator_init(&iter, kxld_object_get_symtab(kext->kext), 1063 kxld_sym_is_unresolved, FALSE); 1064 while ((sym = kxld_symtab_iterator_get_next(&iter))) { 1065 if (!error) { 1066 error = TRUE; 1067 kxld_log(kKxldLogLinking, kKxldLogErr, 1068 "The following symbols are unresolved for this kext:"); 1069 } 1070 kxld_log(kKxldLogLinking, kKxldLogErr, "\t%s", 1071 kxld_demangle(sym->name, &demangled_name, &demangled_length)); 1072 } 1073 require_noerr_action(error, finish, rval=KERN_FAILURE); 1074 1075 rval = KERN_SUCCESS; 1076 1077finish: 1078 if (demangled_name) kxld_free(demangled_name, demangled_length); 1079 return rval; 1080} 1081 1082