Lines Matching defs:ef
216 static int relocate_file1(elf_file_t ef, elf_lookup_fn lookup,
395 elf_file_t ef = (elf_file_t)lf;
407 ef->gdb.l_addr = lf->address;
410 ef->gdb.l_name = newfilename;
411 ef->gdb.l_ld = ef->dynamic;
412 link_elf_add_gdb(&ef->gdb);
454 elf_file_t ef;
468 ef = (elf_file_t) linker_kernel_file;
469 ef->preloaded = 1;
472 ef->address = (caddr_t) (__startkernel - KERNBASE);
474 ef->address = 0;
477 ef->object = NULL;
479 ef->dynamic = dp;
482 parse_dynamic(ef);
493 ef->modptr = preload_kmdp;
505 linker_kernel_file->ctors_addr = ef->address +
510 (void)link_elf_preload_parse_symbols(ef);
530 link_elf_preload_parse_symbols(elf_file_t ef)
539 if (ef->modptr == NULL)
541 pointer = preload_search_info(ef->modptr,
546 pointer = preload_search_info(ef->modptr,
574 ef->ddbsymtab = symtab;
575 ef->ddbsymcnt = symcnt / sizeof(Elf_Sym);
576 ef->ddbstrtab = strtab;
577 ef->ddbstrcnt = strcnt;
583 parse_dynamic(elf_file_t ef)
588 for (dp = ef->dynamic; dp->d_tag != DT_NULL; dp++) {
594 (ef->address + dp->d_un.d_ptr);
595 ef->nbuckets = hashtab[0];
596 ef->nchains = hashtab[1];
597 ef->buckets = hashtab + 2;
598 ef->chains = ef->buckets + ef->nbuckets;
602 ef->strtab = (caddr_t) (ef->address + dp->d_un.d_ptr);
605 ef->strsz = dp->d_un.d_val;
608 ef->symtab = (Elf_Sym*) (ef->address + dp->d_un.d_ptr);
615 ef->got = (Elf_Addr *) (ef->address + dp->d_un.d_ptr);
618 ef->rel = (const Elf_Rel *) (ef->address + dp->d_un.d_ptr);
621 ef->relsize = dp->d_un.d_val;
628 ef->pltrel = (const Elf_Rel *) (ef->address + dp->d_un.d_ptr);
631 ef->pltrelsize = dp->d_un.d_val;
634 ef->rela = (const Elf_Rela *) (ef->address + dp->d_un.d_ptr);
637 ef->relasize = dp->d_un.d_val;
657 ef->pltrela = (const Elf_Rela *)ef->pltrel;
658 ef->pltrel = NULL;
659 ef->pltrelasize = ef->pltrelsize;
660 ef->pltrelsize = 0;
663 ef->ddbsymtab = ef->symtab;
664 ef->ddbsymcnt = ef->nchains;
665 ef->ddbstrtab = ef->strtab;
666 ef->ddbstrcnt = ef->strsz;
668 return elf_cpu_parse_dynamic(ef->address, ef->dynamic);
673 parse_dpcpu(elf_file_t ef)
680 ef->pcpu_start = 0;
681 ef->pcpu_stop = 0;
682 error = link_elf_lookup_set(&ef->lf, "pcpu", (void ***)&ef->pcpu_start,
683 (void ***)&ef->pcpu_stop, NULL);
687 size = (uintptr_t)ef->pcpu_stop - (uintptr_t)ef->pcpu_start;
695 "linker script\n", ef->lf.pathname);
700 pad = *(uint32_t *)((uintptr_t)ef->pcpu_stop - sizeof(pad));
704 ef->lf.pathname, pad, LS_PADDING);
716 ef->pcpu_base = (Elf_Addr)(uintptr_t)dpcpu_alloc(size);
717 if (ef->pcpu_base == 0) {
720 __func__, size, ef->lf.pathname);
723 memcpy((void *)ef->pcpu_base, (void *)ef->pcpu_start, size);
724 dpcpu_copy((void *)ef->pcpu_base, size);
725 elf_set_add(&set_pcpu_list, ef->pcpu_start, ef->pcpu_stop,
726 ef->pcpu_base);
733 parse_vnet(elf_file_t ef)
740 ef->vnet_start = 0;
741 ef->vnet_stop = 0;
742 ef->vnet_base = 0;
743 error = link_elf_lookup_set(&ef->lf, "vnet", (void ***)&ef->vnet_start,
744 (void ***)&ef->vnet_stop, NULL);
748 size = (uintptr_t)ef->vnet_stop - (uintptr_t)ef->vnet_start;
756 "linker script\n", ef->lf.pathname);
761 pad = *(uint32_t *)((uintptr_t)ef->vnet_stop - sizeof(pad));
765 ef->lf.pathname, pad, LS_PADDING);
777 ef->vnet_base = (Elf_Addr)(uintptr_t)vnet_data_alloc(size);
778 if (ef->vnet_base == 0) {
781 __func__, size, ef->lf.pathname);
784 memcpy((void *)ef->vnet_base, (void *)ef->vnet_start, size);
785 vnet_save_init((void *)ef->vnet_base, size);
786 elf_set_add(&set_vnet_list, ef->vnet_start, ef->vnet_stop,
787 ef->vnet_base);
799 preload_protect(elf_file_t ef, vm_prot_t prot)
808 hdr = (Elf_Ehdr *)ef->address;
809 phdr = (Elf_Phdr *)(ef->address + hdr->e_phoff);
820 error = pmap_change_prot((vm_offset_t)ef->address +
883 elf_file_t ef;
907 ef = (elf_file_t) lf;
908 ef->preloaded = 1;
909 ef->modptr = modptr;
910 ef->address = *(caddr_t *)baseptr;
912 ef->object = NULL;
914 dp = (vm_offset_t)ef->address + *(vm_offset_t *)dynptr;
915 ef->dynamic = (Elf_Dyn *)dp;
916 lf->address = ef->address;
924 lf->ctors_addr = ef->address + *ctors_addrp;
932 error = parse_dynamic(ef);
934 error = parse_dpcpu(ef);
937 error = parse_vnet(ef);
940 error = preload_protect(ef, VM_PROT_ALL);
953 elf_file_t ef;
956 ef = (elf_file_t) lf;
957 error = relocate_file(ef);
959 error = preload_protect(ef, VM_PROT_NONE);
962 (void)link_elf_preload_parse_symbols(ef);
988 elf_file_t ef;
1134 ef = (elf_file_t) lf;
1136 ef->object = vm_pager_allocate(OBJT_PHYS, NULL, mapsize, VM_PROT_ALL,
1138 if (ef->object == NULL) {
1150 error = vm_map_find(kernel_map, ef->object, 0,
1154 vm_object_deallocate(ef->object);
1155 ef->object = NULL;
1161 ef->address = mapbase;
1199 ef->dynamic = (Elf_Dyn *) (mapbase + phdyn->p_vaddr - base_vaddr);
1201 lf->address = ef->address;
1204 error = parse_dynamic(ef);
1207 error = parse_dpcpu(ef);
1211 error = parse_vnet(ef);
1222 error = relocate_file(ef);
1299 ef->symbase = malloc(symcnt, M_LINKER, M_WAITOK);
1301 ef->strbase = malloc(strcnt, M_LINKER, M_WAITOK);
1304 ef->symbase, symcnt, shdr[symtabindex].sh_offset,
1310 ef->strbase, strcnt, shdr[symstrindex].sh_offset,
1316 ef->ddbsymcnt = symcnt / sizeof(Elf_Sym);
1317 ef->ddbsymtab = (const Elf_Sym *)ef->symbase;
1318 ef->ddbstrcnt = strcnt;
1319 ef->ddbstrtab = ef->strbase;
1348 elf_file_t ef;
1353 ef = (elf_file_t)lf;
1354 if (x >= ef->pcpu_start && x < ef->pcpu_stop)
1355 return ((x - ef->pcpu_start) + ef->pcpu_base);
1357 if (x >= ef->vnet_start && x < ef->vnet_stop)
1358 return ((x - ef->vnet_start) + ef->vnet_base);
1366 elf_file_t ef = (elf_file_t) file;
1368 if (ef->pcpu_base != 0) {
1369 dpcpu_free((void *)ef->pcpu_base,
1370 ef->pcpu_stop - ef->pcpu_start);
1371 elf_set_delete(&set_pcpu_list, ef->pcpu_start);
1374 if (ef->vnet_base != 0) {
1375 vnet_data_free((void *)ef->vnet_base,
1376 ef->vnet_stop - ef->vnet_start);
1377 elf_set_delete(&set_vnet_list, ef->vnet_start);
1381 if (ef->gdb.l_ld != NULL) {
1383 free((void *)(uintptr_t)ef->gdb.l_name, M_LINKER);
1384 link_elf_delete_gdb(&ef->gdb);
1392 if (ef->preloaded) {
1398 if (ef->object != NULL) {
1399 vm_map_remove(kernel_map, (vm_offset_t) ef->address,
1400 (vm_offset_t) ef->address
1401 + (ef->object->size << PAGE_SHIFT));
1404 free(ef->address, M_LINKER);
1406 free(ef->symbase, M_LINKER);
1407 free(ef->strbase, M_LINKER);
1408 free(ef->ctftab, M_LINKER);
1409 free(ef->ctfoff, M_LINKER);
1410 free(ef->typoff, M_LINKER);
1422 symbol_name(elf_file_t ef, Elf_Size r_info)
1427 ref = ef->symtab + ELF_R_SYM(r_info);
1428 return (ef->strtab + ref->st_name);
1434 symbol_type(elf_file_t ef, Elf_Size r_info)
1439 ref = ef->symtab + ELF_R_SYM(r_info);
1446 relocate_file1(elf_file_t ef, elf_lookup_fn lookup, elf_reloc_fn reloc,
1457 if ((symbol_type(ef, (iter)->r_info) == \
1461 if (reloc(&ef->lf, (Elf_Addr)ef->address, \
1463 symname = symbol_name(ef, (iter)->r_info); \
1471 APPLY_RELOCS(rel, ef->rel, ef->relsize, ELF_RELOC_REL);
1472 TSENTER2("ef->rela");
1473 APPLY_RELOCS(rela, ef->rela, ef->relasize, ELF_RELOC_RELA);
1474 TSEXIT2("ef->rela");
1475 APPLY_RELOCS(rel, ef->pltrel, ef->pltrelsize, ELF_RELOC_REL);
1476 APPLY_RELOCS(rela, ef->pltrela, ef->pltrelasize, ELF_RELOC_RELA);
1485 relocate_file(elf_file_t ef)
1489 error = relocate_file1(ef, elf_lookup, elf_reloc, false);
1491 error = relocate_file1(ef, elf_lookup, elf_reloc, true);
1516 elf_file_t ef = (elf_file_t) lf;
1523 if (ef->buckets == NULL || ef->nbuckets == 0) {
1530 symnum = ef->buckets[hash % ef->nbuckets];
1533 if (symnum >= ef->nchains) {
1538 symp = ef->symtab + symnum;
1544 strp = ef->strtab + symp->st_name;
1560 symnum = ef->chains[symnum];
1578 elf_file_t ef = (elf_file_t)lf;
1586 for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) {
1587 strp = ef->ddbstrtab + symp->st_name;
1607 elf_file_t ef = (elf_file_t)lf;
1612 for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) {
1613 strp = ef->ddbstrtab + symp->st_name;
1628 return (i < ef->ddbsymcnt ? link_elf_ctf_get_ddb(lf, lc) : ENOENT);
1635 elf_file_t ef;
1639 ef = (elf_file_t)lf;
1641 if (es >= ef->symtab && es < ef->symtab + ef->nchains) {
1644 symval->name = ef->strtab + es->st_name;
1645 val = (caddr_t)ef->address + es->st_value;
1668 elf_file_t ef = (elf_file_t)lf;
1674 if (ef->symtab == ef->ddbsymtab)
1677 if (es >= ef->ddbsymtab && es < (ef->ddbsymtab + ef->ddbsymcnt)) {
1678 symval->name = ef->ddbstrtab + es->st_name;
1679 val = (caddr_t)ef->address + es->st_value;
1693 elf_file_t ef = (elf_file_t)lf;
1701 for (i = 0, es = ef->ddbsymtab; i < ef->ddbsymcnt; i++, es++) {
1704 st_value = es->st_value + (uintptr_t) (void *) ef->address;
1785 elf_file_t ef = (elf_file_t)file;
1790 for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) {
1794 error = callback(ef->ddbstrtab + symp->st_name, opaque);
1807 elf_file_t ef = (elf_file_t)file;
1812 for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) {
1830 elf_file_t ef = (elf_file_t)lf;
1832 if (symidx >= ef->nchains)
1834 return (ef->symtab + symidx);
1840 elf_file_t ef = (elf_file_t)lf;
1843 if (symidx >= ef->nchains)
1845 sym = ef->symtab + symidx;
1846 return (ef->strtab + sym->st_name);
1859 elf_file_t ef = (elf_file_t)lf;
1865 if (symidx >= ef->nchains) {
1870 sym = ef->symtab + symidx;
1882 *res = ((Elf_Addr)ef->address + sym->st_value);
1893 symbol = ef->strtab + sym->st_name;
1924 elf_file_t ef = (elf_file_t)lf;
1927 if ((rel = ef->rel) != NULL) {
1928 rellim = (const Elf_Rel *)((const char *)ef->rel + ef->relsize);
1930 elf_reloc_local(lf, (Elf_Addr)ef->address, rel,
1937 if ((rela = ef->rela) != NULL) {
1939 ((const char *)ef->rela + ef->relasize);
1941 elf_reloc_local(lf, (Elf_Addr)ef->address, rela,
1951 elf_file_t ef = (elf_file_t)lf;
1953 *symtab = ef->ddbsymtab;
1958 return (ef->ddbsymcnt);
1964 elf_file_t ef = (elf_file_t)lf;
1966 *strtab = ef->ddbstrtab;
1971 return (ef->ddbstrcnt);
1978 elf_file_t ef = (elf_file_t)lf;
1981 if (ef->vnet_base != 0) {
1982 size = (uintptr_t)ef->vnet_stop - (uintptr_t)ef->vnet_start;
1983 vnet_data_copy((void *)ef->vnet_base, size);
1998 elf_file_t ef;
2002 ef = (elf_file_t)lf;
2003 symp = ef->symtab + symidx;
2005 val = (caddr_t)ef->address + symp->st_value;
2016 elf_file_t ef;
2019 ef = &eff;
2021 bzero_early(ef, sizeof(*ef));
2023 ef->modptr = preload_kmdp;
2024 ef->dynamic = (Elf_Dyn *)&_DYNAMIC;
2027 ef->address = (caddr_t) (__startkernel - KERNBASE);
2029 ef->address = 0;
2031 parse_dynamic(ef);
2033 link_elf_preload_parse_symbols(ef);
2034 relocate_file1(ef, elf_lookup_ifunc, elf_reloc, true);
2042 elf_file_t ef;
2046 ef = (elf_file_t)linker_kernel_file;
2048 relocate_file1(ef, elf_lookup_ifunc, elf_reloc_late, true);