MCPcopy Create free account
hub / github.com/F-Stack/f-stack / link_elf_init

Function link_elf_init

freebsd/kern/link_elf.c:416–497  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

414 &kern_relbase, 0, "Kernel relocated base address");
415
416static void
417link_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,

Callers

nothing calls this directly

Calls 8

linker_add_classFunction · 0.85
preload_search_by_typeFunction · 0.85
preload_search_infoFunction · 0.85
linker_make_fileFunction · 0.85
parse_dynamicFunction · 0.85
panicFunction · 0.70

Tested by

no test coverage detected