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

Function link_elf_link_preload

freebsd/kern/link_elf.c:850–925  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

848#endif /* __arm__ */
849
850static int
851link_elf_link_preload(linker_class_t cls, const char *filename,
852 linker_file_t *result)
853{
854 Elf_Addr *ctors_addrp;
855 Elf_Size *ctors_sizep;
856 caddr_t modptr, baseptr, sizeptr, dynptr;
857 char *type;
858 elf_file_t ef;
859 linker_file_t lf;
860 int error;
861 vm_offset_t dp;
862
863 /* Look to see if we have the file preloaded */
864 modptr = preload_search_by_name(filename);
865 if (modptr == NULL)
866 return (ENOENT);
867
868 type = (char *)preload_search_info(modptr, MODINFO_TYPE);
869 baseptr = preload_search_info(modptr, MODINFO_ADDR);
870 sizeptr = preload_search_info(modptr, MODINFO_SIZE);
871 dynptr = preload_search_info(modptr,
872 MODINFO_METADATA | MODINFOMD_DYNAMIC);
873 if (type == NULL ||
874 (strcmp(type, "elf" __XSTRING(__ELF_WORD_SIZE) " module") != 0 &&
875 strcmp(type, "elf module") != 0))
876 return (EFTYPE);
877 if (baseptr == NULL || sizeptr == NULL || dynptr == NULL)
878 return (EINVAL);
879
880 lf = linker_make_file(filename, &link_elf_class);
881 if (lf == NULL)
882 return (ENOMEM);
883
884 ef = (elf_file_t) lf;
885 ef->preloaded = 1;
886 ef->modptr = modptr;
887 ef->address = *(caddr_t *)baseptr;
888#ifdef SPARSE_MAPPING
889 ef->object = NULL;
890#endif
891 dp = (vm_offset_t)ef->address + *(vm_offset_t *)dynptr;
892 ef->dynamic = (Elf_Dyn *)dp;
893 lf->address = ef->address;
894 lf->size = *(size_t *)sizeptr;
895
896 ctors_addrp = (Elf_Addr *)preload_search_info(modptr,
897 MODINFO_METADATA | MODINFOMD_CTORS_ADDR);
898 ctors_sizep = (Elf_Size *)preload_search_info(modptr,
899 MODINFO_METADATA | MODINFOMD_CTORS_SIZE);
900 if (ctors_addrp != NULL && ctors_sizep != NULL) {
901 lf->ctors_addr = ef->address + *ctors_addrp;
902 lf->ctors_size = *ctors_sizep;
903 }
904
905#ifdef __arm__
906 link_elf_locate_exidx_preload(lf, modptr);
907#endif

Callers

nothing calls this directly

Calls 11

preload_search_by_nameFunction · 0.85
preload_search_infoFunction · 0.85
strcmpFunction · 0.85
linker_make_fileFunction · 0.85
parse_dynamicFunction · 0.85
parse_dpcpuFunction · 0.85
parse_vnetFunction · 0.85
preload_protectFunction · 0.85
linker_file_unloadFunction · 0.85
link_elf_reloc_localFunction · 0.70

Tested by

no test coverage detected