Lines Matching defs:ef
199 static int relocate_file(elf_file_t ef);
220 link_elf_protect_range(elf_file_t ef, vm_offset_t start, vm_offset_t end,
225 KASSERT(start <= end && start >= (vm_offset_t)ef->address &&
226 end <= round_page((vm_offset_t)ef->address + ef->lf.size),
232 if (ef->preloaded) {
252 link_elf_protect(elf_file_t ef)
264 gapprot = ef->preloaded ? VM_PROT_RW : VM_PROT_READ;
266 start = end = (vm_offset_t)ef->address;
268 for (i = 0; i < ef->nprogtab; i++) {
273 if (ef->progtab[i].name != NULL && (
275 strcmp(ef->progtab[i].name, VNET_SETNAME) == 0 ||
277 strcmp(ef->progtab[i].name, DPCPU_SETNAME) == 0))
280 segstart = trunc_page((vm_offset_t)ef->progtab[i].addr);
281 segend = round_page((vm_offset_t)ef->progtab[i].addr +
282 ef->progtab[i].size);
284 if ((ef->progtab[i].flags & SHF_WRITE) != 0)
286 if ((ef->progtab[i].flags & SHF_EXECINSTR) != 0)
296 link_elf_protect_range(ef, start, end, prot);
297 link_elf_protect_range(ef, end, segstart, gapprot);
308 link_elf_protect_range(ef, start, segstart, prot);
320 link_elf_protect_range(ef, start, segstart, prot);
321 link_elf_protect_range(ef, segstart, end,
337 link_elf_protect_range(ef, start, end, prot);
338 link_elf_protect_range(ef, end,
339 round_page((vm_offset_t)ef->address + ef->lf.size), gapprot);
351 elf_file_t ef;
378 ef = (elf_file_t)lf;
379 ef->preloaded = 1;
380 ef->address = *(caddr_t *)baseptr;
393 ef->e_shdr = shdr;
410 ef->nprogtab++;
423 ef->nreltab++;
428 ef->nrelatab++;
434 if (ef->nprogtab == 0 || symstrindex < 0 ||
445 if (ef->nprogtab != 0)
446 ef->progtab = malloc(ef->nprogtab * sizeof(*ef->progtab),
448 if (ef->nreltab != 0)
449 ef->reltab = malloc(ef->nreltab * sizeof(*ef->reltab),
451 if (ef->nrelatab != 0)
452 ef->relatab = malloc(ef->nrelatab * sizeof(*ef->relatab),
454 if ((ef->nprogtab != 0 && ef->progtab == NULL) ||
455 (ef->nreltab != 0 && ef->reltab == NULL) ||
456 (ef->nrelatab != 0 && ef->relatab == NULL)) {
470 (Elf_Addr)ef->address;
473 ef->ddbsymcnt = shdr[symtabindex].sh_size / sizeof(Elf_Sym);
474 ef->ddbsymtab = (Elf_Sym *)shdr[symtabindex].sh_addr;
475 ef->ddbstrcnt = shdr[symstrindex].sh_size;
476 ef->ddbstrtab = (char *)shdr[symstrindex].sh_addr;
477 ef->shstrcnt = shdr[shstrindex].sh_size;
478 ef->shstrtab = (char *)shdr[shstrindex].sh_addr;
495 ef->progtab[pb].addr = (void *)shdr[i].sh_addr;
497 ef->progtab[pb].name = "<<PROGBITS>>";
500 ef->progtab[pb].name = "<<UNWIND>>";
503 ef->progtab[pb].name = "<<INIT_ARRAY>>";
505 ef->progtab[pb].name = "<<FINI_ARRAY>>";
507 ef->progtab[pb].name = "<<NOBITS>>";
508 ef->progtab[pb].size = shdr[i].sh_size;
509 ef->progtab[pb].flags = shdr[i].sh_flags;
510 ef->progtab[pb].sec = i;
511 if (ef->shstrtab && shdr[i].sh_name != 0)
512 ef->progtab[pb].name =
513 ef->shstrtab + shdr[i].sh_name;
514 if (ef->progtab[pb].name != NULL &&
515 !strcmp(ef->progtab[pb].name, DPCPU_SETNAME)) {
528 memcpy(dpcpu, ef->progtab[pb].addr,
529 ef->progtab[pb].size);
531 ef->progtab[pb].addr = dpcpu;
533 } else if (ef->progtab[pb].name != NULL &&
534 !strcmp(ef->progtab[pb].name, VNET_SETNAME)) {
547 memcpy(vnet_data, ef->progtab[pb].addr,
548 ef->progtab[pb].size);
549 ef->progtab[pb].addr = vnet_data;
550 vnet_save_init(ef->progtab[pb].addr,
551 ef->progtab[pb].size);
553 } else if ((ef->progtab[pb].name != NULL &&
554 strcmp(ef->progtab[pb].name, ".ctors") == 0) ||
561 lf->ctors_addr = ef->progtab[pb].addr;
564 } else if ((ef->progtab[pb].name != NULL &&
565 strcmp(ef->progtab[pb].name, ".dtors") == 0) ||
572 lf->dtors_addr = ef->progtab[pb].addr;
578 for (j = 0; j < ef->ddbsymcnt; j++) {
579 es = &ef->ddbsymtab[j];
582 es->st_value += (Elf_Addr)ef->progtab[pb].addr;
589 ef->reltab[rl].rel = (Elf_Rel *)shdr[i].sh_addr;
590 ef->reltab[rl].nrel = shdr[i].sh_size / sizeof(Elf_Rel);
591 ef->reltab[rl].sec = shdr[i].sh_info;
597 ef->relatab[ra].rela = (Elf_Rela *)shdr[i].sh_addr;
598 ef->relatab[ra].nrela =
600 ef->relatab[ra].sec = shdr[i].sh_info;
605 if (pb != ef->nprogtab) {
610 if (rl != ef->nreltab) {
615 if (ra != ef->nrelatab) {
626 link_elf_protect_range(ef, (vm_offset_t)ef->address,
627 round_page((vm_offset_t)ef->address + ef->lf.size), VM_PROT_ALL);
685 elf_file_t ef;
688 ef = (elf_file_t)lf;
689 error = relocate_file(ef);
706 link_elf_protect(ef);
727 elf_file_t ef;
805 ef = (elf_file_t) lf;
806 ef->nprogtab = 0;
807 ef->e_shdr = 0;
808 ef->nreltab = 0;
809 ef->nrelatab = 0;
819 ef->e_shdr = shdr;
847 ef->nprogtab++;
861 ef->nreltab++;
866 ef->nrelatab++;
872 if (ef->nprogtab == 0) {
892 if (ef->nprogtab != 0)
893 ef->progtab = malloc(ef->nprogtab * sizeof(*ef->progtab),
895 if (ef->nreltab != 0)
896 ef->reltab = malloc(ef->nreltab * sizeof(*ef->reltab),
898 if (ef->nrelatab != 0)
899 ef->relatab = malloc(ef->nrelatab * sizeof(*ef->relatab),
908 ef->ddbsymcnt = shdr[symtabindex].sh_size / sizeof(Elf_Sym);
909 ef->ddbsymtab = malloc(shdr[symtabindex].sh_size, M_LINKER, M_WAITOK);
910 error = vn_rdwr(UIO_READ, nd->ni_vp, (void *)ef->ddbsymtab,
922 ef->ddbstrcnt = shdr[symstrindex].sh_size;
923 ef->ddbstrtab = malloc(shdr[symstrindex].sh_size, M_LINKER, M_WAITOK);
924 error = vn_rdwr(UIO_READ, nd->ni_vp, ef->ddbstrtab,
940 ef->shstrcnt = shdr[shstrindex].sh_size;
941 ef->shstrtab = malloc(shdr[shstrindex].sh_size, M_LINKER,
943 error = vn_rdwr(UIO_READ, nd->ni_vp, ef->shstrtab,
983 ef->object = vm_pager_allocate(OBJT_PHYS, NULL, round_page(mapsize),
985 if (ef->object == NULL) {
990 vm_object_color(ef->object, 0);
1005 error = vm_map_find(kernel_map, ef->object, 0, &mapbase,
1009 vm_object_deallocate(ef->object);
1010 ef->object = NULL;
1025 lf->address = ef->address = (caddr_t)mapbase;
1052 if (ef->shstrtab != NULL && shdr[i].sh_name != 0) {
1053 ef->progtab[pb].name =
1054 ef->shstrtab + shdr[i].sh_name;
1055 if (!strcmp(ef->progtab[pb].name, ".ctors") ||
1067 } else if (!strcmp(ef->progtab[pb].name,
1082 ef->progtab[pb].name = "<<PROGBITS>>";
1085 ef->progtab[pb].name = "<<UNWIND>>";
1088 ef->progtab[pb].name = "<<NOBITS>>";
1089 if (ef->progtab[pb].name != NULL &&
1090 !strcmp(ef->progtab[pb].name, DPCPU_SETNAME)) {
1091 ef->progtab[pb].addr =
1093 if (ef->progtab[pb].addr == NULL) {
1102 else if (ef->progtab[pb].name != NULL &&
1103 !strcmp(ef->progtab[pb].name, VNET_SETNAME)) {
1104 ef->progtab[pb].addr =
1106 if (ef->progtab[pb].addr == NULL) {
1116 ef->progtab[pb].addr =
1118 if (ef->progtab[pb].addr == NULL) {
1122 ef->progtab[pb].size = shdr[i].sh_size;
1123 ef->progtab[pb].flags = shdr[i].sh_flags;
1124 ef->progtab[pb].sec = i;
1131 ef->progtab[pb].addr,
1142 if (ef->progtab[pb].addr != (void *)mapbase &&
1143 !strcmp(ef->progtab[pb].name, DPCPU_SETNAME))
1144 dpcpu_copy(ef->progtab[pb].addr,
1147 bzero(ef->progtab[pb].addr, shdr[i].sh_size);
1150 if (ef->progtab[pb].addr != (void *)mapbase &&
1151 strcmp(ef->progtab[pb].name, VNET_SETNAME) == 0)
1152 vnet_save_init(ef->progtab[pb].addr,
1153 ef->progtab[pb].size);
1156 for (j = 0; j < ef->ddbsymcnt; j++) {
1157 es = &ef->ddbsymtab[j];
1160 es->st_value += (Elf_Addr)ef->progtab[pb].addr;
1168 ef->reltab[rl].rel = malloc(shdr[i].sh_size, M_LINKER,
1170 ef->reltab[rl].nrel = shdr[i].sh_size / sizeof(Elf_Rel);
1171 ef->reltab[rl].sec = shdr[i].sh_info;
1173 (void *)ef->reltab[rl].rel,
1188 ef->relatab[ra].rela = malloc(shdr[i].sh_size, M_LINKER,
1190 ef->relatab[ra].nrela =
1192 ef->relatab[ra].sec = shdr[i].sh_info;
1194 (void *)ef->relatab[ra].rela,
1208 if (pb != ef->nprogtab) {
1213 if (rl != ef->nreltab) {
1218 if (ra != ef->nrelatab) {
1223 if (mapbase != (vm_offset_t)ef->address + mapsize) {
1227 (u_long)mapbase, ef->address, (u_long)mapsize,
1228 (u_long)(vm_offset_t)ef->address + mapsize);
1246 error = relocate_file(ef);
1262 link_elf_protect(ef);
1280 elf_file_t ef = (elf_file_t) file;
1288 if (ef->progtab) {
1289 for (i = 0; i < ef->nprogtab; i++) {
1290 if (ef->progtab[i].size == 0)
1292 if (ef->progtab[i].name == NULL)
1294 if (!strcmp(ef->progtab[i].name, DPCPU_SETNAME))
1295 dpcpu_free(ef->progtab[i].addr,
1296 ef->progtab[i].size);
1298 else if (!strcmp(ef->progtab[i].name, VNET_SETNAME))
1299 vnet_data_free(ef->progtab[i].addr,
1300 ef->progtab[i].size);
1304 if (ef->preloaded) {
1305 free(ef->reltab, M_LINKER);
1306 free(ef->relatab, M_LINKER);
1307 free(ef->progtab, M_LINKER);
1308 free(ef->ctftab, M_LINKER);
1309 free(ef->ctfoff, M_LINKER);
1310 free(ef->typoff, M_LINKER);
1316 for (i = 0; i < ef->nreltab; i++)
1317 free(ef->reltab[i].rel, M_LINKER);
1318 for (i = 0; i < ef->nrelatab; i++)
1319 free(ef->relatab[i].rela, M_LINKER);
1320 free(ef->reltab, M_LINKER);
1321 free(ef->relatab, M_LINKER);
1322 free(ef->progtab, M_LINKER);
1324 if (ef->object != NULL)
1325 vm_map_remove(kernel_map, (vm_offset_t)ef->address,
1326 (vm_offset_t)ef->address + ptoa(ef->object->size));
1327 free(ef->e_shdr, M_LINKER);
1328 free(ef->ddbsymtab, M_LINKER);
1329 free(ef->ddbstrtab, M_LINKER);
1330 free(ef->shstrtab, M_LINKER);
1331 free(ef->ctftab, M_LINKER);
1332 free(ef->ctfoff, M_LINKER);
1333 free(ef->typoff, M_LINKER);
1337 symbol_name(elf_file_t ef, Elf_Size r_info)
1342 ref = ef->ddbsymtab + ELF_R_SYM(r_info);
1343 return ef->ddbstrtab + ref->st_name;
1349 findbase(elf_file_t ef, int sec)
1354 for (i = 0; i < ef->nprogtab; i++) {
1355 if (sec == ef->progtab[i].sec) {
1356 base = (Elf_Addr)ef->progtab[i].addr;
1364 relocate_file1(elf_file_t ef, bool ifuncs)
1377 for (i = 0; i < ef->nreltab; i++) {
1378 rel = ef->reltab[i].rel;
1380 link_elf_error(ef->lf.filename, "lost a reltab!");
1383 rellim = rel + ef->reltab[i].nrel;
1384 base = findbase(ef, ef->reltab[i].sec);
1386 link_elf_error(ef->lf.filename, "lost base for reltab");
1391 if (symidx >= ef->ddbsymcnt)
1393 sym = ef->ddbsymtab + symidx;
1400 if (elf_reloc(&ef->lf, base, rel, ELF_RELOC_REL,
1402 symname = symbol_name(ef, rel->r_info);
1411 for (i = 0; i < ef->nrelatab; i++) {
1412 rela = ef->relatab[i].rela;
1414 link_elf_error(ef->lf.filename, "lost a relatab!");
1417 relalim = rela + ef->relatab[i].nrela;
1418 base = findbase(ef, ef->relatab[i].sec);
1420 link_elf_error(ef->lf.filename,
1426 if (symidx >= ef->ddbsymcnt)
1428 sym = ef->ddbsymtab + symidx;
1435 if (elf_reloc(&ef->lf, base, rela, ELF_RELOC_RELA,
1437 symname = symbol_name(ef, rela->r_info);
1450 elf_obj_cleanup_globals_cache(ef);
1456 relocate_file(elf_file_t ef)
1460 error = relocate_file1(ef, false);
1462 error = relocate_file1(ef, true);
1470 elf_file_t ef = (elf_file_t)lf;
1475 for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) {
1476 strp = ef->ddbstrtab + symp->st_name;
1517 elf_file_t ef;
1521 ef = (elf_file_t) lf;
1524 if (es >= ef->ddbsymtab && es < (ef->ddbsymtab + ef->ddbsymcnt)) {
1527 symval->name = ef->ddbstrtab + es->st_name;
1557 elf_file_t ef = (elf_file_t)lf;
1565 for (i = 0, es = ef->ddbsymtab; i < ef->ddbsymcnt; i++, es++) {
1596 elf_file_t ef = (elf_file_t)lf;
1601 for (i = 0; i < ef->nprogtab; i++) {
1602 if ((strncmp(ef->progtab[i].name, "set_", 4) == 0) &&
1603 strcmp(ef->progtab[i].name + 4, name) == 0) {
1604 start = (void **)ef->progtab[i].addr;
1605 stop = (void **)((char *)ef->progtab[i].addr +
1606 ef->progtab[i].size);
1624 elf_file_t ef = (elf_file_t)file;
1629 for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) {
1633 error = callback(ef->ddbstrtab + symp->st_name, opaque);
1646 elf_file_t ef = (elf_file_t)file;
1651 for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) {
1667 elf_obj_cleanup_globals_cache(elf_file_t ef)
1672 for (i = 0; i < ef->ddbsymcnt; i++) {
1673 sym = ef->ddbsymtab + i;
1691 elf_file_t ef = (elf_file_t)lf;
1697 if (symidx >= ef->ddbsymcnt) {
1702 sym = ef->ddbsymtab + symidx;
1723 symbol = ef->ddbstrtab + sym->st_name;
1760 link_elf_fix_link_set(elf_file_t ef)
1772 symidx < ef->ddbsymcnt; symidx++) {
1773 sym = ef->ddbsymtab + symidx;
1777 sym_name = ef->ddbstrtab + sym->st_name;
1789 for (i = 0; i < ef->nprogtab; i++) {
1790 if (strcmp(ef->progtab[i].name, linkset_name) == 0) {
1791 startp = (Elf_Addr)ef->progtab[i].addr;
1792 stopp = (Elf_Addr)(startp + ef->progtab[i].size);
1796 if (i == ef->nprogtab)
1807 elf_file_t ef = (elf_file_t)lf;
1817 link_elf_fix_link_set(ef);
1820 for (i = 0; i < ef->nreltab; i++) {
1821 rel = ef->reltab[i].rel;
1823 link_elf_error(ef->lf.filename, "lost a reltab");
1826 rellim = rel + ef->reltab[i].nrel;
1827 base = findbase(ef, ef->reltab[i].sec);
1829 link_elf_error(ef->lf.filename, "lost base for reltab");
1834 if (symidx >= ef->ddbsymcnt)
1836 sym = ef->ddbsymtab + symidx;
1850 for (i = 0; i < ef->nrelatab; i++) {
1851 rela = ef->relatab[i].rela;
1853 link_elf_error(ef->lf.filename, "lost a relatab!");
1856 relalim = rela + ef->relatab[i].nrela;
1857 base = findbase(ef, ef->relatab[i].sec);
1859 link_elf_error(ef->lf.filename, "lost base for reltab");
1864 if (symidx >= ef->ddbsymcnt)
1866 sym = ef->ddbsymtab + symidx;
1884 elf_file_t ef = (elf_file_t)lf;
1886 *symtab = ef->ddbsymtab;
1889 return (ef->ddbsymcnt);
1895 elf_file_t ef = (elf_file_t)lf;
1897 *strtab = ef->ddbstrtab;
1900 return (ef->ddbstrcnt);
1907 elf_file_t ef = (elf_file_t) lf;
1909 if (ef->progtab) {
1910 for (int i = 0; i < ef->nprogtab; i++) {
1911 if (ef->progtab[i].size == 0)
1913 if (ef->progtab[i].name == NULL)
1915 if (strcmp(ef->progtab[i].name, VNET_SETNAME) == 0) {
1916 vnet_data_copy(ef->progtab[i].addr,
1917 ef->progtab[i].size);