- /*****
- * Wrap the kernel link state in-place in an OSData.
- * This is unnecessary (and the link state may not be present) if the kernel
- * does not have kxld support because this information is only used for
- * runtime linking.
- */
-#if CONFIG_KXLD
- kernelLinkStateSection = getsectbyname(kPrelinkLinkStateSegment,
- kPrelinkKernelLinkStateSection);
- if (!kernelLinkStateSection) {
- OSKextLog(/* kext */ NULL,
- kOSKextLogErrorLevel |
- kOSKextLogArchiveFlag,
- "Can't find prelinked kernel link state.");
- goto finish;
- }
-
- theKernel = OSKext::lookupKextWithIdentifier(kOSKextKernelIdentifier);
- if (!theKernel) {
- OSKextLog(/* kext */ NULL,
- kOSKextLogErrorLevel |
- kOSKextLogArchiveFlag,
- "Can't find kernel kext object in prelinked kernel.");
- goto finish;
- }
-
- prelinkData = (void *) kernelLinkStateSection->addr;
- prelinkLength = kernelLinkStateSection->size;
-
- mem_result = kmem_alloc_pageable(kernel_map,
- (vm_offset_t *) &prelinkCopy, prelinkLength);
- if (mem_result != KERN_SUCCESS) {
- OSKextLog(/* kext */ NULL,
- kOSKextLogErrorLevel |
- kOSKextLogGeneralFlag | kOSKextLogArchiveFlag,
- "Can't copy prelinked kernel link state.");
- goto finish;
- }
- memcpy(prelinkCopy, prelinkData, prelinkLength);
-
- theKernel->linkState = OSData::withBytesNoCopy(prelinkCopy, prelinkLength);
- if (!theKernel->linkState) {
- OSKextLog(/* kext */ NULL,
- kOSKextLogErrorLevel |
- kOSKextLogGeneralFlag | kOSKextLogArchiveFlag,
- "Can't create prelinked kernel link state wrapper.");
- goto finish;
- }
- theKernel->linkState->setDeallocFunction(osdata_kmem_free);
-#endif
-