Lines Matching refs:kext

67     KXLDObject *kext;
80 const KXLDObject *kext, const KXLDObject *interface,
84 static kern_return_t export_symbols(const KXLDObject *kext,
88 static kern_return_t create_vtables(KXLDKext *kext,
90 static kern_return_t get_vtable_syms_from_smcp(KXLDKext *kext,
94 static kern_return_t resolve_symbols(KXLDKext *kext,
97 static kern_return_t patch_vtables(KXLDKext *kext, KXLDDict *patched_vtables,
100 KXLDKext *kext, KXLDSym *super_metaclass_pointer_sym);
101 static kern_return_t create_vtable_index(KXLDKext *kext);
103 static kern_return_t validate_symbols(KXLDKext *kext);
116 kxld_kext_init(KXLDKext *kext, KXLDObject *kext_object,
121 check(kext);
124 kext->kext = kext_object;
127 kext->interface = interface_object;
129 rval = kxld_object_index_symbols_by_name(kext->kext);
141 kxld_kext_clear(KXLDKext *kext)
146 check(kext);
148 for (i = 0; i < kext->vtables.nitems; ++i) {
149 vtable = kxld_array_get_item(&kext->vtables, i);
152 kxld_array_reset(&kext->vtables);
153 kxld_dict_clear(&kext->vtable_index);
155 kext->kext = NULL;
156 kext->interface = NULL;
157 kext->vtables_created = FALSE;
158 kext->vtable_index_created = FALSE;
165 kxld_kext_deinit(KXLDKext *kext)
170 check(kext);
172 for (i = 0; i < kext->vtables.maxitems; ++i) {
173 vtable = kxld_array_get_slot(&kext->vtables, i);
176 kxld_array_deinit(&kext->vtables);
177 kxld_dict_deinit(&kext->vtable_index);
179 bzero(kext, sizeof(*kext));
185 kxld_kext_export_symbols(const KXLDKext *kext,
192 check(kext);
194 if (kext->interface) {
195 rval = export_symbols_through_interface(kext->kext, kext->interface,
200 rval = export_symbols(kext->kext, defined_symbols_by_name,
213 export_symbols_through_interface(const KXLDObject *kext,
224 check(kext);
227 kext_symtab = kxld_object_get_symtab(kext);
240 kxld_object_get_name(interface), kxld_object_get_name(kext),
259 kxld_object_get_name(interface), kxld_object_get_name(kext),
300 export_symbols(const KXLDObject *kext, KXLDDict *defined_symbols_by_name,
307 (void) kxld_symtab_iterator_init(&iter, kxld_object_get_symtab(kext),
330 kxld_kext_export_vtables(KXLDKext *kext, const KXLDDict *defined_cxx_symbols,
337 check(kext);
342 rval = create_vtables(kext, defined_cxx_symbols, defined_symbols);
345 for (i = 0; i < kext->vtables.nitems; ++i) {
346 vtable = kxld_array_get_item(&kext->vtables, i);
360 kxld_kext_get_vmsize(const KXLDKext *kext,
363 (void) kxld_object_get_vmsize(kext->kext, header_size, vmsize);
369 kxld_kext_set_linked_object_size(KXLDKext *kext, u_long vmsize)
371 (void) kxld_object_set_linked_object_size(kext->kext, vmsize);
378 kxld_kext_export_linked_object(const KXLDKext *kext,
385 kxld_object_get_symtab(kext->kext), KXLD_KMOD_INFO_SYMBOL);
391 rval = kxld_object_export_linked_object(kext->kext, linked_object);
399 kxld_kext_relocate(KXLDKext *kext, kxld_addr_t link_address,
405 check(kext);
417 rval = kxld_object_index_cxx_symbols_by_value(kext->kext);
420 rval = kxld_object_index_symbols_by_name(kext->kext);
423 rval = kxld_object_relocate(kext->kext, link_address);
426 rval = resolve_symbols(kext, defined_symbols, obsolete_symbols);
429 rval = create_vtables(kext, defined_cxx_symbols, /* defined_symbols */ NULL);
432 rval = patch_vtables(kext, patched_vtables, defined_symbols);
435 rval = validate_symbols(kext);
438 rval = kxld_object_process_relocations(kext->kext, patched_vtables);
449 * it will look in the kext's symbol table for vtable symbols.
461 create_vtables(KXLDKext *kext, const KXLDDict *defined_cxx_symbols,
475 if (kext->vtables_created) {
480 symtab = kxld_object_get_symtab(kext->kext);
482 if (kxld_object_is_linked(kext->kext)) {
497 rval = kxld_array_init(&kext->vtables, sizeof(KXLDVTable), nvtables);
501 if (kxld_object_is_linked(kext->kext)) {
506 rval = get_vtable_syms_from_smcp(kext, defined_symbols, sym,
511 vtable = kxld_array_get_item(&kext->vtables, i++);
512 rval = kxld_vtable_init(vtable, vtable_sym, kext->kext,
520 if (!kxld_object_is_linked(kext->kext)) {
522 meta_vtable = kxld_array_get_item(&kext->vtables, i++);
524 kext->kext, defined_cxx_symbols);
527 kxld_array_resize(&kext->vtables, --nvtables);
532 require_action(i == kext->vtables.nitems, finish,
535 kext->vtables_created = TRUE;
544 get_vtable_syms_from_smcp(KXLDKext *kext, const KXLDDict *defined_symbols,
560 check(kext);
564 require(!kxld_object_is_kernel(kext->kext), finish);
566 symtab = kxld_object_get_symtab(kext->kext);
602 if (kxld_object_target_supports_strict_patching(kext->kext)) {
631 resolve_symbols(KXLDKext *kext, const KXLDDict *defined_symbols,
645 check(kext->kext);
649 symtab = kxld_object_get_symtab(kext->kext);
651 /* Check if the kext tests for weak symbols */
691 if (kxld_object_target_supports_common_symbols(kext->kext)) {
697 "Use -fno-common to build your kext. "
727 "This kext uses obsolete symbol %s.",
734 /* Make sure that the kext has referenced gOSKextUnresolved.
739 "This kext has weak references but does not test for "
795 patch_vtables(KXLDKext *kext, KXLDDict *patched_vtables,
821 check(kext);
824 symtab = kxld_object_get_symtab(kext->kext);
826 rval = create_vtable_index(kext);
852 vtable = kxld_dict_find(&kext->vtable_index, vtable_name);
861 kext, super_metaclass_pointer);
879 unpatched_super_vtable = kxld_dict_find(&kext->vtable_index,
924 rval = kxld_vtable_patch(vtable, super_vtable, kext->kext);
940 vtable = kxld_dict_find(&kext->vtable_index, vtable_name);
963 rval = kxld_vtable_patch(vtable, super_vtable, kext->kext);
991 create_vtable_index(KXLDKext *kext)
997 if (kext->vtable_index_created) {
1003 rval = kxld_dict_init(&kext->vtable_index, kxld_dict_string_hash,
1004 kxld_dict_string_cmp, kext->vtables.nitems);
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);
1013 kext->vtable_index_created = TRUE;
1022 get_metaclass_symbol_from_super_meta_class_pointer_symbol(KXLDKext *kext,
1030 check(kext);
1034 reloc = kxld_object_get_reloc_at_symbol(kext->kext,
1039 sect = kxld_object_get_section_by_index(kext->kext,
1044 metaclass = kxld_object_get_symbol_of_reloc(kext->kext, reloc, sect);
1052 validate_symbols(KXLDKext *kext)
1062 kxld_symtab_iterator_init(&iter, kxld_object_get_symtab(kext->kext),
1068 "The following symbols are unresolved for this kext:");