Lines Matching refs: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;
381 ef = (elf_file_t)lf;
382 ef->preloaded = 1;
383 ef->address = *(caddr_t *)baseptr;
396 ef->e_shdr = shdr;
413 ef->nprogtab++;
426 ef->nreltab++;
431 ef->nrelatab++;
437 if (ef->nprogtab == 0 || symstrindex < 0 ||
448 if (ef->nprogtab != 0)
449 ef->progtab = malloc(ef->nprogtab * sizeof(*ef->progtab),
451 if (ef->nreltab != 0)
452 ef->reltab = malloc(ef->nreltab * sizeof(*ef->reltab),
454 if (ef->nrelatab != 0)
455 ef->relatab = malloc(ef->nrelatab * sizeof(*ef->relatab),
457 if ((ef->nprogtab != 0 && ef->progtab == NULL) ||
458 (ef->nreltab != 0 && ef->reltab == NULL) ||
459 (ef->nrelatab != 0 && ef->relatab == NULL)) {
473 (Elf_Addr)ef->address;
476 ef->ddbsymcnt = shdr[symtabindex].sh_size / sizeof(Elf_Sym);
477 ef->ddbsymtab = (Elf_Sym *)shdr[symtabindex].sh_addr;
478 ef->ddbstrcnt = shdr[symstrindex].sh_size;
479 ef->ddbstrtab = (char *)shdr[symstrindex].sh_addr;
480 ef->shstrcnt = shdr[shstrindex].sh_size;
481 ef->shstrtab = (char *)shdr[shstrindex].sh_addr;
498 ef->progtab[pb].addr = (void *)shdr[i].sh_addr;
500 ef->progtab[pb].name = "<<PROGBITS>>";
503 ef->progtab[pb].name = "<<UNWIND>>";
506 ef->progtab[pb].name = "<<INIT_ARRAY>>";
508 ef->progtab[pb].name = "<<FINI_ARRAY>>";
510 ef->progtab[pb].name = "<<NOBITS>>";
511 ef->progtab[pb].size = shdr[i].sh_size;
512 ef->progtab[pb].flags = shdr[i].sh_flags;
513 ef->progtab[pb].sec = i;
514 if (ef->shstrtab && shdr[i].sh_name != 0)
515 ef->progtab[pb].name =
516 ef->shstrtab + shdr[i].sh_name;
517 if (ef->progtab[pb].name != NULL &&
518 !strcmp(ef->progtab[pb].name, DPCPU_SETNAME)) {
531 memcpy(dpcpu, ef->progtab[pb].addr,
532 ef->progtab[pb].size);
534 ef->progtab[pb].addr = dpcpu;
536 } else if (ef->progtab[pb].name != NULL &&
537 !strcmp(ef->progtab[pb].name, VNET_SETNAME)) {
550 memcpy(vnet_data, ef->progtab[pb].addr,
551 ef->progtab[pb].size);
552 ef->progtab[pb].addr = vnet_data;
553 vnet_save_init(ef->progtab[pb].addr,
554 ef->progtab[pb].size);
556 } else if ((ef->progtab[pb].name != NULL &&
557 strcmp(ef->progtab[pb].name, ".ctors") == 0) ||
564 lf->ctors_addr = ef->progtab[pb].addr;
567 } else if ((ef->progtab[pb].name != NULL &&
568 strcmp(ef->progtab[pb].name, ".dtors") == 0) ||
575 lf->dtors_addr = ef->progtab[pb].addr;
581 for (j = 0; j < ef->ddbsymcnt; j++) {
582 es = &ef->ddbsymtab[j];
585 es->st_value += (Elf_Addr)ef->progtab[pb].addr;
592 ef->reltab[rl].rel = (Elf_Rel *)shdr[i].sh_addr;
593 ef->reltab[rl].nrel = shdr[i].sh_size / sizeof(Elf_Rel);
594 ef->reltab[rl].sec = shdr[i].sh_info;
600 ef->relatab[ra].rela = (Elf_Rela *)shdr[i].sh_addr;
601 ef->relatab[ra].nrela =
603 ef->relatab[ra].sec = shdr[i].sh_info;
608 if (pb != ef->nprogtab) {
613 if (rl != ef->nreltab) {
618 if (ra != ef->nrelatab) {
629 link_elf_protect_range(ef, (vm_offset_t)ef->address,
630 round_page((vm_offset_t)ef->address + ef->lf.size), VM_PROT_ALL);
688 elf_file_t ef;
691 ef = (elf_file_t)lf;
692 error = relocate_file(ef);
709 link_elf_protect(ef);
730 elf_file_t ef;
808 ef = (elf_file_t) lf;
809 ef->nprogtab = 0;
810 ef->e_shdr = 0;
811 ef->nreltab = 0;
812 ef->nrelatab = 0;
822 ef->e_shdr = shdr;
850 ef->nprogtab++;
864 ef->nreltab++;
869 ef->nrelatab++;
875 if (ef->nprogtab == 0) {
895 if (ef->nprogtab != 0)
896 ef->progtab = malloc(ef->nprogtab * sizeof(*ef->progtab),
898 if (ef->nreltab != 0)
899 ef->reltab = malloc(ef->nreltab * sizeof(*ef->reltab),
901 if (ef->nrelatab != 0)
902 ef->relatab = malloc(ef->nrelatab * sizeof(*ef->relatab),
911 ef->ddbsymcnt = shdr[symtabindex].sh_size / sizeof(Elf_Sym);
912 ef->ddbsymtab = malloc(shdr[symtabindex].sh_size, M_LINKER, M_WAITOK);
913 error = vn_rdwr(UIO_READ, nd->ni_vp, (void *)ef->ddbsymtab,
925 ef->ddbstrcnt = shdr[symstrindex].sh_size;
926 ef->ddbstrtab = malloc(shdr[symstrindex].sh_size, M_LINKER, M_WAITOK);
927 error = vn_rdwr(UIO_READ, nd->ni_vp, ef->ddbstrtab,
943 ef->shstrcnt = shdr[shstrindex].sh_size;
944 ef->shstrtab = malloc(shdr[shstrindex].sh_size, M_LINKER,
946 error = vn_rdwr(UIO_READ, nd->ni_vp, ef->shstrtab,
986 ef->object = vm_pager_allocate(OBJT_PHYS, NULL, round_page(mapsize),
988 if (ef->object == NULL) {
993 vm_object_color(ef->object, 0);
1008 error = vm_map_find(kernel_map, ef->object, 0, &mapbase,
1012 vm_object_deallocate(ef->object);
1013 ef->object = NULL;
1028 lf->address = ef->address = (caddr_t)mapbase;
1055 if (ef->shstrtab != NULL && shdr[i].sh_name != 0) {
1056 ef->progtab[pb].name =
1057 ef->shstrtab + shdr[i].sh_name;
1058 if (!strcmp(ef->progtab[pb].name, ".ctors") ||
1070 } else if (!strcmp(ef->progtab[pb].name,
1085 ef->progtab[pb].name = "<<PROGBITS>>";
1088 ef->progtab[pb].name = "<<UNWIND>>";
1091 ef->progtab[pb].name = "<<NOBITS>>";
1092 if (ef->progtab[pb].name != NULL &&
1093 !strcmp(ef->progtab[pb].name, DPCPU_SETNAME)) {
1094 ef->progtab[pb].addr =
1096 if (ef->progtab[pb].addr == NULL) {
1105 else if (ef->progtab[pb].name != NULL &&
1106 !strcmp(ef->progtab[pb].name, VNET_SETNAME)) {
1107 ef->progtab[pb].addr =
1109 if (ef->progtab[pb].addr == NULL) {
1119 ef->progtab[pb].addr =
1121 if (ef->progtab[pb].addr == NULL) {
1125 ef->progtab[pb].size = shdr[i].sh_size;
1126 ef->progtab[pb].flags = shdr[i].sh_flags;
1127 ef->progtab[pb].sec = i;
1134 ef->progtab[pb].addr,
1145 if (ef->progtab[pb].addr != (void *)mapbase &&
1146 !strcmp(ef->progtab[pb].name, DPCPU_SETNAME))
1147 dpcpu_copy(ef->progtab[pb].addr,
1150 bzero(ef->progtab[pb].addr, shdr[i].sh_size);
1153 if (ef->progtab[pb].addr != (void *)mapbase &&
1154 strcmp(ef->progtab[pb].name, VNET_SETNAME) == 0)
1155 vnet_save_init(ef->progtab[pb].addr,
1156 ef->progtab[pb].size);
1159 for (j = 0; j < ef->ddbsymcnt; j++) {
1160 es = &ef->ddbsymtab[j];
1163 es->st_value += (Elf_Addr)ef->progtab[pb].addr;
1171 ef->reltab[rl].rel = malloc(shdr[i].sh_size, M_LINKER,
1173 ef->reltab[rl].nrel = shdr[i].sh_size / sizeof(Elf_Rel);
1174 ef->reltab[rl].sec = shdr[i].sh_info;
1176 (void *)ef->reltab[rl].rel,
1191 ef->relatab[ra].rela = malloc(shdr[i].sh_size, M_LINKER,
1193 ef->relatab[ra].nrela =
1195 ef->relatab[ra].sec = shdr[i].sh_info;
1197 (void *)ef->relatab[ra].rela,
1211 if (pb != ef->nprogtab) {
1216 if (rl != ef->nreltab) {
1221 if (ra != ef->nrelatab) {
1226 if (mapbase != (vm_offset_t)ef->address + mapsize) {
1230 (u_long)mapbase, ef->address, (u_long)mapsize,
1231 (u_long)(vm_offset_t)ef->address + mapsize);
1249 error = relocate_file(ef);
1265 link_elf_protect(ef);
1283 elf_file_t ef = (elf_file_t) file;
1291 if (ef->progtab) {
1292 for (i = 0; i < ef->nprogtab; i++) {
1293 if (ef->progtab[i].size == 0)
1295 if (ef->progtab[i].name == NULL)
1297 if (!strcmp(ef->progtab[i].name, DPCPU_SETNAME))
1298 dpcpu_free(ef->progtab[i].addr,
1299 ef->progtab[i].size);
1301 else if (!strcmp(ef->progtab[i].name, VNET_SETNAME))
1302 vnet_data_free(ef->progtab[i].addr,
1303 ef->progtab[i].size);
1307 if (ef->preloaded) {
1308 free(ef->reltab, M_LINKER);
1309 free(ef->relatab, M_LINKER);
1310 free(ef->progtab, M_LINKER);
1311 free(ef->ctftab, M_LINKER);
1312 free(ef->ctfoff, M_LINKER);
1313 free(ef->typoff, M_LINKER);
1319 for (i = 0; i < ef->nreltab; i++)
1320 free(ef->reltab[i].rel, M_LINKER);
1321 for (i = 0; i < ef->nrelatab; i++)
1322 free(ef->relatab[i].rela, M_LINKER);
1323 free(ef->reltab, M_LINKER);
1324 free(ef->relatab, M_LINKER);
1325 free(ef->progtab, M_LINKER);
1327 if (ef->object != NULL)
1328 vm_map_remove(kernel_map, (vm_offset_t)ef->address,
1329 (vm_offset_t)ef->address + ptoa(ef->object->size));
1330 free(ef->e_shdr, M_LINKER);
1331 free(ef->ddbsymtab, M_LINKER);
1332 free(ef->ddbstrtab, M_LINKER);
1333 free(ef->shstrtab, M_LINKER);
1334 free(ef->ctftab, M_LINKER);
1335 free(ef->ctfoff, M_LINKER);
1336 free(ef->typoff, M_LINKER);
1340 symbol_name(elf_file_t ef, Elf_Size r_info)
1345 ref = ef->ddbsymtab + ELF_R_SYM(r_info);
1346 return ef->ddbstrtab + ref->st_name;
1352 findbase(elf_file_t ef, int sec)
1357 for (i = 0; i < ef->nprogtab; i++) {
1358 if (sec == ef->progtab[i].sec) {
1359 base = (Elf_Addr)ef->progtab[i].addr;
1367 relocate_file1(elf_file_t ef, bool ifuncs)
1380 for (i = 0; i < ef->nreltab; i++) {
1381 rel = ef->reltab[i].rel;
1383 link_elf_error(ef->lf.filename, "lost a reltab!");
1386 rellim = rel + ef->reltab[i].nrel;
1387 base = findbase(ef, ef->reltab[i].sec);
1389 link_elf_error(ef->lf.filename, "lost base for reltab");
1394 if (symidx >= ef->ddbsymcnt)
1396 sym = ef->ddbsymtab + symidx;
1403 if (elf_reloc(&ef->lf, base, rel, ELF_RELOC_REL,
1405 symname = symbol_name(ef, rel->r_info);
1414 for (i = 0; i < ef->nrelatab; i++) {
1415 rela = ef->relatab[i].rela;
1417 link_elf_error(ef->lf.filename, "lost a relatab!");
1420 relalim = rela + ef->relatab[i].nrela;
1421 base = findbase(ef, ef->relatab[i].sec);
1423 link_elf_error(ef->lf.filename,
1429 if (symidx >= ef->ddbsymcnt)
1431 sym = ef->ddbsymtab + symidx;
1438 if (elf_reloc(&ef->lf, base, rela, ELF_RELOC_RELA,
1440 symname = symbol_name(ef, rela->r_info);
1453 elf_obj_cleanup_globals_cache(ef);
1459 relocate_file(elf_file_t ef)
1463 error = relocate_file1(ef, false);
1465 error = relocate_file1(ef, true);
1473 elf_file_t ef = (elf_file_t)lf;
1478 for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) {
1479 strp = ef->ddbstrtab + symp->st_name;
1520 elf_file_t ef;
1524 ef = (elf_file_t) lf;
1527 if (es >= ef->ddbsymtab && es < (ef->ddbsymtab + ef->ddbsymcnt)) {
1530 symval->name = ef->ddbstrtab + es->st_name;
1560 elf_file_t ef = (elf_file_t)lf;
1568 for (i = 0, es = ef->ddbsymtab; i < ef->ddbsymcnt; i++, es++) {
1599 elf_file_t ef = (elf_file_t)lf;
1604 for (i = 0; i < ef->nprogtab; i++) {
1605 if ((strncmp(ef->progtab[i].name, "set_", 4) == 0) &&
1606 strcmp(ef->progtab[i].name + 4, name) == 0) {
1607 start = (void **)ef->progtab[i].addr;
1608 stop = (void **)((char *)ef->progtab[i].addr +
1609 ef->progtab[i].size);
1627 elf_file_t ef = (elf_file_t)file;
1632 for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) {
1636 error = callback(ef->ddbstrtab + symp->st_name, opaque);
1649 elf_file_t ef = (elf_file_t)file;
1654 for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) {
1670 elf_obj_cleanup_globals_cache(elf_file_t ef)
1675 for (i = 0; i < ef->ddbsymcnt; i++) {
1676 sym = ef->ddbsymtab + i;
1694 elf_file_t ef = (elf_file_t)lf;
1700 if (symidx >= ef->ddbsymcnt) {
1705 sym = ef->ddbsymtab + symidx;
1726 symbol = ef->ddbstrtab + sym->st_name;
1763 link_elf_fix_link_set(elf_file_t ef)
1775 symidx < ef->ddbsymcnt; symidx++) {
1776 sym = ef->ddbsymtab + symidx;
1780 sym_name = ef->ddbstrtab + sym->st_name;
1792 for (i = 0; i < ef->nprogtab; i++) {
1793 if (strcmp(ef->progtab[i].name, linkset_name) == 0) {
1794 startp = (Elf_Addr)ef->progtab[i].addr;
1795 stopp = (Elf_Addr)(startp + ef->progtab[i].size);
1799 if (i == ef->nprogtab)
1810 elf_file_t ef = (elf_file_t)lf;
1820 link_elf_fix_link_set(ef);
1823 for (i = 0; i < ef->nreltab; i++) {
1824 rel = ef->reltab[i].rel;
1826 link_elf_error(ef->lf.filename, "lost a reltab");
1829 rellim = rel + ef->reltab[i].nrel;
1830 base = findbase(ef, ef->reltab[i].sec);
1832 link_elf_error(ef->lf.filename, "lost base for reltab");
1837 if (symidx >= ef->ddbsymcnt)
1839 sym = ef->ddbsymtab + symidx;
1853 for (i = 0; i < ef->nrelatab; i++) {
1854 rela = ef->relatab[i].rela;
1856 link_elf_error(ef->lf.filename, "lost a relatab!");
1859 relalim = rela + ef->relatab[i].nrela;
1860 base = findbase(ef, ef->relatab[i].sec);
1862 link_elf_error(ef->lf.filename, "lost base for reltab");
1867 if (symidx >= ef->ddbsymcnt)
1869 sym = ef->ddbsymtab + symidx;
1887 elf_file_t ef = (elf_file_t)lf;
1889 *symtab = ef->ddbsymtab;
1892 return (ef->ddbsymcnt);
1898 elf_file_t ef = (elf_file_t)lf;
1900 *strtab = ef->ddbstrtab;
1903 return (ef->ddbstrcnt);
1910 elf_file_t ef = (elf_file_t) lf;
1912 if (ef->progtab) {
1913 for (int i = 0; i < ef->nprogtab; i++) {
1914 if (ef->progtab[i].size == 0)
1916 if (ef->progtab[i].name == NULL)
1918 if (strcmp(ef->progtab[i].name, VNET_SETNAME) == 0) {
1919 vnet_data_copy(ef->progtab[i].addr,
1920 ef->progtab[i].size);