| 848 | #endif /* __arm__ */ |
| 849 | |
| 850 | static int |
| 851 | link_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 |
nothing calls this directly
no test coverage detected