Lines Matching refs: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;
472 ef = (elf_file_t) linker_kernel_file;
473 ef->preloaded = 1;
476 ef->address = (caddr_t) (__startkernel - KERNBASE);
478 ef->address = 0;
481 ef->object = NULL;
483 ef->dynamic = dp;
486 parse_dynamic(ef);
497 ef->modptr = modptr;
509 linker_kernel_file->ctors_addr = ef->address +
514 (void)link_elf_preload_parse_symbols(ef);
534 link_elf_preload_parse_symbols(elf_file_t ef)
543 if (ef->modptr == NULL)
545 pointer = preload_search_info(ef->modptr,
550 pointer = preload_search_info(ef->modptr,
578 ef->ddbsymtab = symtab;
579 ef->ddbsymcnt = symcnt / sizeof(Elf_Sym);
580 ef->ddbstrtab = strtab;
581 ef->ddbstrcnt = strcnt;
587 parse_dynamic(elf_file_t ef)
592 for (dp = ef->dynamic; dp->d_tag != DT_NULL; dp++) {
598 (ef->address + dp->d_un.d_ptr);
599 ef->nbuckets = hashtab[0];
600 ef->nchains = hashtab[1];
601 ef->buckets = hashtab + 2;
602 ef->chains = ef->buckets + ef->nbuckets;
606 ef->strtab = (caddr_t) (ef->address + dp->d_un.d_ptr);
609 ef->strsz = dp->d_un.d_val;
612 ef->symtab = (Elf_Sym*) (ef->address + dp->d_un.d_ptr);
619 ef->got = (Elf_Addr *) (ef->address + dp->d_un.d_ptr);
622 ef->rel = (const Elf_Rel *) (ef->address + dp->d_un.d_ptr);
625 ef->relsize = dp->d_un.d_val;
632 ef->pltrel = (const Elf_Rel *) (ef->address + dp->d_un.d_ptr);
635 ef->pltrelsize = dp->d_un.d_val;
638 ef->rela = (const Elf_Rela *) (ef->address + dp->d_un.d_ptr);
641 ef->relasize = dp->d_un.d_val;
661 ef->pltrela = (const Elf_Rela *)ef->pltrel;
662 ef->pltrel = NULL;
663 ef->pltrelasize = ef->pltrelsize;
664 ef->pltrelsize = 0;
667 ef->ddbsymtab = ef->symtab;
668 ef->ddbsymcnt = ef->nchains;
669 ef->ddbstrtab = ef->strtab;
670 ef->ddbstrcnt = ef->strsz;
672 return elf_cpu_parse_dynamic(ef->address, ef->dynamic);
677 parse_dpcpu(elf_file_t ef)
684 ef->pcpu_start = 0;
685 ef->pcpu_stop = 0;
686 error = link_elf_lookup_set(&ef->lf, "pcpu", (void ***)&ef->pcpu_start,
687 (void ***)&ef->pcpu_stop, NULL);
691 size = (uintptr_t)ef->pcpu_stop - (uintptr_t)ef->pcpu_start;
699 "linker script\n", ef->lf.pathname);
704 pad = *(uint32_t *)((uintptr_t)ef->pcpu_stop - sizeof(pad));
708 ef->lf.pathname, pad, LS_PADDING);
720 ef->pcpu_base = (Elf_Addr)(uintptr_t)dpcpu_alloc(size);
721 if (ef->pcpu_base == 0) {
724 __func__, size, ef->lf.pathname);
727 memcpy((void *)ef->pcpu_base, (void *)ef->pcpu_start, size);
728 dpcpu_copy((void *)ef->pcpu_base, size);
729 elf_set_add(&set_pcpu_list, ef->pcpu_start, ef->pcpu_stop,
730 ef->pcpu_base);
737 parse_vnet(elf_file_t ef)
744 ef->vnet_start = 0;
745 ef->vnet_stop = 0;
746 ef->vnet_base = 0;
747 error = link_elf_lookup_set(&ef->lf, "vnet", (void ***)&ef->vnet_start,
748 (void ***)&ef->vnet_stop, NULL);
752 size = (uintptr_t)ef->vnet_stop - (uintptr_t)ef->vnet_start;
760 "linker script\n", ef->lf.pathname);
765 pad = *(uint32_t *)((uintptr_t)ef->vnet_stop - sizeof(pad));
769 ef->lf.pathname, pad, LS_PADDING);
781 ef->vnet_base = (Elf_Addr)(uintptr_t)vnet_data_alloc(size);
782 if (ef->vnet_base == 0) {
785 __func__, size, ef->lf.pathname);
788 memcpy((void *)ef->vnet_base, (void *)ef->vnet_start, size);
789 vnet_save_init((void *)ef->vnet_base, size);
790 elf_set_add(&set_vnet_list, ef->vnet_start, ef->vnet_stop,
791 ef->vnet_base);
803 preload_protect(elf_file_t ef, vm_prot_t prot)
812 hdr = (Elf_Ehdr *)ef->address;
813 phdr = (Elf_Phdr *)(ef->address + hdr->e_phoff);
824 error = pmap_change_prot((vm_offset_t)ef->address +
887 elf_file_t ef;
913 ef = (elf_file_t) lf;
914 ef->preloaded = 1;
915 ef->modptr = modptr;
916 ef->address = *(caddr_t *)baseptr;
918 ef->object = NULL;
920 dp = (vm_offset_t)ef->address + *(vm_offset_t *)dynptr;
921 ef->dynamic = (Elf_Dyn *)dp;
922 lf->address = ef->address;
930 lf->ctors_addr = ef->address + *ctors_addrp;
938 error = parse_dynamic(ef);
940 error = parse_dpcpu(ef);
943 error = parse_vnet(ef);
946 error = preload_protect(ef, VM_PROT_ALL);
959 elf_file_t ef;
962 ef = (elf_file_t) lf;
963 error = relocate_file(ef);
965 error = preload_protect(ef, VM_PROT_NONE);
968 (void)link_elf_preload_parse_symbols(ef);
994 elf_file_t ef;
1140 ef = (elf_file_t) lf;
1142 ef->object = vm_pager_allocate(OBJT_PHYS, NULL, mapsize, VM_PROT_ALL,
1144 if (ef->object == NULL) {
1156 error = vm_map_find(kernel_map, ef->object, 0,
1160 vm_object_deallocate(ef->object);
1161 ef->object = NULL;
1167 ef->address = mapbase;
1205 ef->dynamic = (Elf_Dyn *) (mapbase + phdyn->p_vaddr - base_vaddr);
1207 lf->address = ef->address;
1210 error = parse_dynamic(ef);
1213 error = parse_dpcpu(ef);
1217 error = parse_vnet(ef);
1228 error = relocate_file(ef);
1305 ef->symbase = malloc(symcnt, M_LINKER, M_WAITOK);
1307 ef->strbase = malloc(strcnt, M_LINKER, M_WAITOK);
1310 ef->symbase, symcnt, shdr[symtabindex].sh_offset,
1316 ef->strbase, strcnt, shdr[symstrindex].sh_offset,
1322 ef->ddbsymcnt = symcnt / sizeof(Elf_Sym);
1323 ef->ddbsymtab = (const Elf_Sym *)ef->symbase;
1324 ef->ddbstrcnt = strcnt;
1325 ef->ddbstrtab = ef->strbase;
1354 elf_file_t ef;
1359 ef = (elf_file_t)lf;
1360 if (x >= ef->pcpu_start && x < ef->pcpu_stop)
1361 return ((x - ef->pcpu_start) + ef->pcpu_base);
1363 if (x >= ef->vnet_start && x < ef->vnet_stop)
1364 return ((x - ef->vnet_start) + ef->vnet_base);
1372 elf_file_t ef = (elf_file_t) file;
1374 if (ef->pcpu_base != 0) {
1375 dpcpu_free((void *)ef->pcpu_base,
1376 ef->pcpu_stop - ef->pcpu_start);
1377 elf_set_delete(&set_pcpu_list, ef->pcpu_start);
1380 if (ef->vnet_base != 0) {
1381 vnet_data_free((void *)ef->vnet_base,
1382 ef->vnet_stop - ef->vnet_start);
1383 elf_set_delete(&set_vnet_list, ef->vnet_start);
1387 if (ef->gdb.l_ld != NULL) {
1389 free((void *)(uintptr_t)ef->gdb.l_name, M_LINKER);
1390 link_elf_delete_gdb(&ef->gdb);
1398 if (ef->preloaded) {
1404 if (ef->object != NULL) {
1405 vm_map_remove(kernel_map, (vm_offset_t) ef->address,
1406 (vm_offset_t) ef->address
1407 + (ef->object->size << PAGE_SHIFT));
1410 free(ef->address, M_LINKER);
1412 free(ef->symbase, M_LINKER);
1413 free(ef->strbase, M_LINKER);
1414 free(ef->ctftab, M_LINKER);
1415 free(ef->ctfoff, M_LINKER);
1416 free(ef->typoff, M_LINKER);
1428 symbol_name(elf_file_t ef, Elf_Size r_info)
1433 ref = ef->symtab + ELF_R_SYM(r_info);
1434 return (ef->strtab + ref->st_name);
1440 symbol_type(elf_file_t ef, Elf_Size r_info)
1445 ref = ef->symtab + ELF_R_SYM(r_info);
1452 relocate_file1(elf_file_t ef, elf_lookup_fn lookup, elf_reloc_fn reloc,
1463 if ((symbol_type(ef, (iter)->r_info) == \
1467 if (reloc(&ef->lf, (Elf_Addr)ef->address, \
1469 symname = symbol_name(ef, (iter)->r_info); \
1477 APPLY_RELOCS(rel, ef->rel, ef->relsize, ELF_RELOC_REL);
1478 TSENTER2("ef->rela");
1479 APPLY_RELOCS(rela, ef->rela, ef->relasize, ELF_RELOC_RELA);
1480 TSEXIT2("ef->rela");
1481 APPLY_RELOCS(rel, ef->pltrel, ef->pltrelsize, ELF_RELOC_REL);
1482 APPLY_RELOCS(rela, ef->pltrela, ef->pltrelasize, ELF_RELOC_RELA);
1491 relocate_file(elf_file_t ef)
1495 error = relocate_file1(ef, elf_lookup, elf_reloc, false);
1497 error = relocate_file1(ef, elf_lookup, elf_reloc, true);
1522 elf_file_t ef = (elf_file_t) lf;
1529 if (ef->buckets == NULL || ef->nbuckets == 0) {
1536 symnum = ef->buckets[hash % ef->nbuckets];
1539 if (symnum >= ef->nchains) {
1544 symp = ef->symtab + symnum;
1550 strp = ef->strtab + symp->st_name;
1566 symnum = ef->chains[symnum];
1584 elf_file_t ef = (elf_file_t)lf;
1592 for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) {
1593 strp = ef->ddbstrtab + symp->st_name;
1613 elf_file_t ef = (elf_file_t)lf;
1618 for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) {
1619 strp = ef->ddbstrtab + symp->st_name;
1634 return (i < ef->ddbsymcnt ? link_elf_ctf_get_ddb(lf, lc) : ENOENT);
1641 elf_file_t ef;
1645 ef = (elf_file_t)lf;
1647 if (es >= ef->symtab && es < ef->symtab + ef->nchains) {
1650 symval->name = ef->strtab + es->st_name;
1651 val = (caddr_t)ef->address + es->st_value;
1674 elf_file_t ef = (elf_file_t)lf;
1680 if (ef->symtab == ef->ddbsymtab)
1683 if (es >= ef->ddbsymtab && es < (ef->ddbsymtab + ef->ddbsymcnt)) {
1684 symval->name = ef->ddbstrtab + es->st_name;
1685 val = (caddr_t)ef->address + es->st_value;
1699 elf_file_t ef = (elf_file_t)lf;
1707 for (i = 0, es = ef->ddbsymtab; i < ef->ddbsymcnt; i++, es++) {
1710 st_value = es->st_value + (uintptr_t) (void *) ef->address;
1791 elf_file_t ef = (elf_file_t)file;
1796 for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) {
1800 error = callback(ef->ddbstrtab + symp->st_name, opaque);
1813 elf_file_t ef = (elf_file_t)file;
1818 for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) {
1836 elf_file_t ef = (elf_file_t)lf;
1838 if (symidx >= ef->nchains)
1840 return (ef->symtab + symidx);
1846 elf_file_t ef = (elf_file_t)lf;
1849 if (symidx >= ef->nchains)
1851 sym = ef->symtab + symidx;
1852 return (ef->strtab + sym->st_name);
1865 elf_file_t ef = (elf_file_t)lf;
1871 if (symidx >= ef->nchains) {
1876 sym = ef->symtab + symidx;
1888 *res = ((Elf_Addr)ef->address + sym->st_value);
1899 symbol = ef->strtab + sym->st_name;
1930 elf_file_t ef = (elf_file_t)lf;
1933 if ((rel = ef->rel) != NULL) {
1934 rellim = (const Elf_Rel *)((const char *)ef->rel + ef->relsize);
1936 elf_reloc_local(lf, (Elf_Addr)ef->address, rel,
1943 if ((rela = ef->rela) != NULL) {
1945 ((const char *)ef->rela + ef->relasize);
1947 elf_reloc_local(lf, (Elf_Addr)ef->address, rela,
1957 elf_file_t ef = (elf_file_t)lf;
1959 *symtab = ef->ddbsymtab;
1964 return (ef->ddbsymcnt);
1970 elf_file_t ef = (elf_file_t)lf;
1972 *strtab = ef->ddbstrtab;
1977 return (ef->ddbstrcnt);
1984 elf_file_t ef = (elf_file_t)lf;
1987 if (ef->vnet_base != 0) {
1988 size = (uintptr_t)ef->vnet_stop - (uintptr_t)ef->vnet_start;
1989 vnet_data_copy((void *)ef->vnet_base, size);
2004 elf_file_t ef;
2008 ef = (elf_file_t)lf;
2009 symp = ef->symtab + symidx;
2011 val = (caddr_t)ef->address + symp->st_value;
2022 elf_file_t ef;
2025 ef = &eff;
2027 bzero_early(ef, sizeof(*ef));
2029 ef->modptr = kmdp;
2030 ef->dynamic = (Elf_Dyn *)&_DYNAMIC;
2033 ef->address = (caddr_t) (__startkernel - KERNBASE);
2035 ef->address = 0;
2037 parse_dynamic(ef);
2039 link_elf_preload_parse_symbols(ef);
2040 relocate_file1(ef, elf_lookup_ifunc, elf_reloc, true);
2048 elf_file_t ef;
2052 ef = (elf_file_t)linker_kernel_file;
2054 relocate_file1(ef, elf_lookup_ifunc, elf_reloc_late, true);