| 414 | &kern_relbase, 0, "Kernel relocated base address"); |
| 415 | |
| 416 | static void |
| 417 | link_elf_init(void* arg) |
| 418 | { |
| 419 | Elf_Dyn *dp; |
| 420 | Elf_Addr *ctors_addrp; |
| 421 | Elf_Size *ctors_sizep; |
| 422 | caddr_t modptr, baseptr, sizeptr; |
| 423 | elf_file_t ef; |
| 424 | const char *modname; |
| 425 | |
| 426 | linker_add_class(&link_elf_class); |
| 427 | |
| 428 | dp = (Elf_Dyn *)&_DYNAMIC; |
| 429 | modname = NULL; |
| 430 | modptr = preload_search_by_type("elf" __XSTRING(__ELF_WORD_SIZE) " kernel"); |
| 431 | if (modptr == NULL) |
| 432 | modptr = preload_search_by_type("elf kernel"); |
| 433 | modname = (char *)preload_search_info(modptr, MODINFO_NAME); |
| 434 | if (modname == NULL) |
| 435 | modname = "kernel"; |
| 436 | linker_kernel_file = linker_make_file(modname, &link_elf_class); |
| 437 | if (linker_kernel_file == NULL) |
| 438 | panic("%s: Can't create linker structures for kernel", |
| 439 | __func__); |
| 440 | |
| 441 | ef = (elf_file_t) linker_kernel_file; |
| 442 | ef->preloaded = 1; |
| 443 | #ifdef RELOCATABLE_KERNEL |
| 444 | /* Compute relative displacement */ |
| 445 | ef->address = (caddr_t) (__startkernel - KERNBASE); |
| 446 | #else |
| 447 | ef->address = 0; |
| 448 | #endif |
| 449 | #ifdef SPARSE_MAPPING |
| 450 | ef->object = NULL; |
| 451 | #endif |
| 452 | ef->dynamic = dp; |
| 453 | |
| 454 | if (dp != NULL) |
| 455 | parse_dynamic(ef); |
| 456 | #ifdef RELOCATABLE_KERNEL |
| 457 | linker_kernel_file->address = (caddr_t)__startkernel; |
| 458 | linker_kernel_file->size = (intptr_t)(__endkernel - __startkernel); |
| 459 | kern_relbase = (unsigned long)__startkernel; |
| 460 | #else |
| 461 | linker_kernel_file->address += KERNBASE; |
| 462 | linker_kernel_file->size = -(intptr_t)linker_kernel_file->address; |
| 463 | #endif |
| 464 | |
| 465 | if (modptr != NULL) { |
| 466 | ef->modptr = modptr; |
| 467 | baseptr = preload_search_info(modptr, MODINFO_ADDR); |
| 468 | if (baseptr != NULL) |
| 469 | linker_kernel_file->address = *(caddr_t *)baseptr; |
| 470 | sizeptr = preload_search_info(modptr, MODINFO_SIZE); |
| 471 | if (sizeptr != NULL) |
| 472 | linker_kernel_file->size = *(size_t *)sizeptr; |
| 473 | ctors_addrp = (Elf_Addr *)preload_search_info(modptr, |
nothing calls this directly
no test coverage detected