Lines Matching refs:ef

178 static int	relocate_file(elf_file_t ef);
208 elf_file_t ef; in link_elf_link_preload() local
238 ef = (elf_file_t)lf; in link_elf_link_preload()
239 ef->preloaded = 1; in link_elf_link_preload()
240 ef->address = *(caddr_t *)baseptr; in link_elf_link_preload()
253 ef->e_shdr = shdr; in link_elf_link_preload()
268 ef->nprogtab++; in link_elf_link_preload()
281 ef->nreltab++; in link_elf_link_preload()
286 ef->nrelatab++; in link_elf_link_preload()
292 if (ef->nprogtab == 0 || symstrindex < 0 || in link_elf_link_preload()
303 if (ef->nprogtab != 0) in link_elf_link_preload()
304 ef->progtab = malloc(ef->nprogtab * sizeof(*ef->progtab), in link_elf_link_preload()
306 if (ef->nreltab != 0) in link_elf_link_preload()
307 ef->reltab = malloc(ef->nreltab * sizeof(*ef->reltab), in link_elf_link_preload()
309 if (ef->nrelatab != 0) in link_elf_link_preload()
310 ef->relatab = malloc(ef->nrelatab * sizeof(*ef->relatab), in link_elf_link_preload()
312 if ((ef->nprogtab != 0 && ef->progtab == NULL) || in link_elf_link_preload()
313 (ef->nreltab != 0 && ef->reltab == NULL) || in link_elf_link_preload()
314 (ef->nrelatab != 0 && ef->relatab == NULL)) { in link_elf_link_preload()
328 (Elf_Addr)ef->address; in link_elf_link_preload()
331 ef->ddbsymcnt = shdr[symtabindex].sh_size / sizeof(Elf_Sym); in link_elf_link_preload()
332 ef->ddbsymtab = (Elf_Sym *)shdr[symtabindex].sh_addr; in link_elf_link_preload()
333 ef->ddbstrcnt = shdr[symstrindex].sh_size; in link_elf_link_preload()
334 ef->ddbstrtab = (char *)shdr[symstrindex].sh_addr; in link_elf_link_preload()
335 ef->shstrcnt = shdr[shstrindex].sh_size; in link_elf_link_preload()
336 ef->shstrtab = (char *)shdr[shstrindex].sh_addr; in link_elf_link_preload()
351 ef->progtab[pb].addr = (void *)shdr[i].sh_addr; in link_elf_link_preload()
353 ef->progtab[pb].name = "<<PROGBITS>>"; in link_elf_link_preload()
356 ef->progtab[pb].name = "<<UNWIND>>"; in link_elf_link_preload()
359 ef->progtab[pb].name = "<<NOBITS>>"; in link_elf_link_preload()
360 ef->progtab[pb].size = shdr[i].sh_size; in link_elf_link_preload()
361 ef->progtab[pb].sec = i; in link_elf_link_preload()
362 if (ef->shstrtab && shdr[i].sh_name != 0) in link_elf_link_preload()
363 ef->progtab[pb].name = in link_elf_link_preload()
364 ef->shstrtab + shdr[i].sh_name; in link_elf_link_preload()
365 if (ef->progtab[pb].name != NULL && in link_elf_link_preload()
366 !strcmp(ef->progtab[pb].name, DPCPU_SETNAME)) { in link_elf_link_preload()
379 memcpy(dpcpu, ef->progtab[pb].addr, in link_elf_link_preload()
380 ef->progtab[pb].size); in link_elf_link_preload()
382 ef->progtab[pb].addr = dpcpu; in link_elf_link_preload()
384 } else if (ef->progtab[pb].name != NULL && in link_elf_link_preload()
385 !strcmp(ef->progtab[pb].name, VNET_SETNAME)) { in link_elf_link_preload()
398 memcpy(vnet_data, ef->progtab[pb].addr, in link_elf_link_preload()
399 ef->progtab[pb].size); in link_elf_link_preload()
401 ef->progtab[pb].addr = vnet_data; in link_elf_link_preload()
403 } else if (ef->progtab[pb].name != NULL && in link_elf_link_preload()
404 !strcmp(ef->progtab[pb].name, ".ctors")) { in link_elf_link_preload()
405 lf->ctors_addr = ef->progtab[pb].addr; in link_elf_link_preload()
410 for (j = 0; j < ef->ddbsymcnt; j++) { in link_elf_link_preload()
411 es = &ef->ddbsymtab[j]; in link_elf_link_preload()
414 es->st_value += (Elf_Addr)ef->progtab[pb].addr; in link_elf_link_preload()
421 ef->reltab[rl].rel = (Elf_Rel *)shdr[i].sh_addr; in link_elf_link_preload()
422 ef->reltab[rl].nrel = shdr[i].sh_size / sizeof(Elf_Rel); in link_elf_link_preload()
423 ef->reltab[rl].sec = shdr[i].sh_info; in link_elf_link_preload()
429 ef->relatab[ra].rela = (Elf_Rela *)shdr[i].sh_addr; in link_elf_link_preload()
430 ef->relatab[ra].nrela = in link_elf_link_preload()
432 ef->relatab[ra].sec = shdr[i].sh_info; in link_elf_link_preload()
437 if (pb != ef->nprogtab) { in link_elf_link_preload()
442 if (rl != ef->nreltab) { in link_elf_link_preload()
447 if (ra != ef->nrelatab) { in link_elf_link_preload()
485 elf_file_t ef; in link_elf_link_preload_finish() local
488 ef = (elf_file_t)lf; in link_elf_link_preload_finish()
489 error = relocate_file(ef); in link_elf_link_preload_finish()
525 elf_file_t ef; in link_elf_load_file() local
603 ef = (elf_file_t) lf; in link_elf_load_file()
604 ef->nprogtab = 0; in link_elf_load_file()
605 ef->e_shdr = 0; in link_elf_load_file()
606 ef->nreltab = 0; in link_elf_load_file()
607 ef->nrelatab = 0; in link_elf_load_file()
617 ef->e_shdr = shdr; in link_elf_load_file()
643 ef->nprogtab++; in link_elf_load_file()
657 ef->nreltab++; in link_elf_load_file()
662 ef->nrelatab++; in link_elf_load_file()
668 if (ef->nprogtab == 0) { in link_elf_load_file()
688 if (ef->nprogtab != 0) in link_elf_load_file()
689 ef->progtab = malloc(ef->nprogtab * sizeof(*ef->progtab), in link_elf_load_file()
691 if (ef->nreltab != 0) in link_elf_load_file()
692 ef->reltab = malloc(ef->nreltab * sizeof(*ef->reltab), in link_elf_load_file()
694 if (ef->nrelatab != 0) in link_elf_load_file()
695 ef->relatab = malloc(ef->nrelatab * sizeof(*ef->relatab), in link_elf_load_file()
704 ef->ddbsymcnt = shdr[symtabindex].sh_size / sizeof(Elf_Sym); in link_elf_load_file()
705 ef->ddbsymtab = malloc(shdr[symtabindex].sh_size, M_LINKER, M_WAITOK); in link_elf_load_file()
706 error = vn_rdwr(UIO_READ, nd->ni_vp, (void *)ef->ddbsymtab, in link_elf_load_file()
718 ef->ddbstrcnt = shdr[symstrindex].sh_size; in link_elf_load_file()
719 ef->ddbstrtab = malloc(shdr[symstrindex].sh_size, M_LINKER, M_WAITOK); in link_elf_load_file()
720 error = vn_rdwr(UIO_READ, nd->ni_vp, ef->ddbstrtab, in link_elf_load_file()
736 ef->shstrcnt = shdr[shstrindex].sh_size; in link_elf_load_file()
737 ef->shstrtab = malloc(shdr[shstrindex].sh_size, M_LINKER, in link_elf_load_file()
739 error = vn_rdwr(UIO_READ, nd->ni_vp, ef->shstrtab, in link_elf_load_file()
777 ef->object = vm_object_allocate(OBJT_DEFAULT, in link_elf_load_file()
779 if (ef->object == NULL) { in link_elf_load_file()
783 ef->address = (caddr_t) vm_map_min(kernel_map); in link_elf_load_file()
795 error = vm_map_find(kernel_map, ef->object, 0, &mapbase, in link_elf_load_file()
799 vm_object_deallocate(ef->object); in link_elf_load_file()
800 ef->object = 0; in link_elf_load_file()
814 lf->address = ef->address = (caddr_t)mapbase; in link_elf_load_file()
839 if (ef->shstrtab != NULL && shdr[i].sh_name != 0) { in link_elf_load_file()
840 ef->progtab[pb].name = in link_elf_load_file()
841 ef->shstrtab + shdr[i].sh_name; in link_elf_load_file()
842 if (!strcmp(ef->progtab[pb].name, ".ctors")) { in link_elf_load_file()
847 ef->progtab[pb].name = "<<PROGBITS>>"; in link_elf_load_file()
850 ef->progtab[pb].name = "<<UNWIND>>"; in link_elf_load_file()
853 ef->progtab[pb].name = "<<NOBITS>>"; in link_elf_load_file()
854 if (ef->progtab[pb].name != NULL && in link_elf_load_file()
855 !strcmp(ef->progtab[pb].name, DPCPU_SETNAME)) { in link_elf_load_file()
856 ef->progtab[pb].addr = in link_elf_load_file()
858 if (ef->progtab[pb].addr == NULL) { in link_elf_load_file()
867 else if (ef->progtab[pb].name != NULL && in link_elf_load_file()
868 !strcmp(ef->progtab[pb].name, VNET_SETNAME)) { in link_elf_load_file()
869 ef->progtab[pb].addr = in link_elf_load_file()
871 if (ef->progtab[pb].addr == NULL) { in link_elf_load_file()
881 ef->progtab[pb].addr = in link_elf_load_file()
883 if (ef->progtab[pb].addr == NULL) { in link_elf_load_file()
887 ef->progtab[pb].size = shdr[i].sh_size; in link_elf_load_file()
888 ef->progtab[pb].sec = i; in link_elf_load_file()
895 ef->progtab[pb].addr, in link_elf_load_file()
906 if (ef->progtab[pb].addr != (void *)mapbase && in link_elf_load_file()
907 !strcmp(ef->progtab[pb].name, DPCPU_SETNAME)) in link_elf_load_file()
908 dpcpu_copy(ef->progtab[pb].addr, in link_elf_load_file()
911 else if (ef->progtab[pb].addr != in link_elf_load_file()
913 !strcmp(ef->progtab[pb].name, VNET_SETNAME)) in link_elf_load_file()
914 vnet_data_copy(ef->progtab[pb].addr, in link_elf_load_file()
918 bzero(ef->progtab[pb].addr, shdr[i].sh_size); in link_elf_load_file()
921 for (j = 0; j < ef->ddbsymcnt; j++) { in link_elf_load_file()
922 es = &ef->ddbsymtab[j]; in link_elf_load_file()
925 es->st_value += (Elf_Addr)ef->progtab[pb].addr; in link_elf_load_file()
933 ef->reltab[rl].rel = malloc(shdr[i].sh_size, M_LINKER, in link_elf_load_file()
935 ef->reltab[rl].nrel = shdr[i].sh_size / sizeof(Elf_Rel); in link_elf_load_file()
936 ef->reltab[rl].sec = shdr[i].sh_info; in link_elf_load_file()
938 (void *)ef->reltab[rl].rel, in link_elf_load_file()
953 ef->relatab[ra].rela = malloc(shdr[i].sh_size, M_LINKER, in link_elf_load_file()
955 ef->relatab[ra].nrela = in link_elf_load_file()
957 ef->relatab[ra].sec = shdr[i].sh_info; in link_elf_load_file()
959 (void *)ef->relatab[ra].rela, in link_elf_load_file()
973 if (pb != ef->nprogtab) { in link_elf_load_file()
978 if (rl != ef->nreltab) { in link_elf_load_file()
983 if (ra != ef->nrelatab) { in link_elf_load_file()
988 if (mapbase != (vm_offset_t)ef->address + mapsize) { in link_elf_load_file()
992 (u_long)mapbase, ef->address, (u_long)mapsize, in link_elf_load_file()
993 (u_long)(vm_offset_t)ef->address + mapsize); in link_elf_load_file()
1011 error = relocate_file(ef); in link_elf_load_file()
1046 elf_file_t ef = (elf_file_t) file; in link_elf_unload_file() local
1052 if (ef->progtab) { in link_elf_unload_file()
1053 for (i = 0; i < ef->nprogtab; i++) { in link_elf_unload_file()
1054 if (ef->progtab[i].size == 0) in link_elf_unload_file()
1056 if (ef->progtab[i].name == NULL) in link_elf_unload_file()
1058 if (!strcmp(ef->progtab[i].name, DPCPU_SETNAME)) in link_elf_unload_file()
1059 dpcpu_free(ef->progtab[i].addr, in link_elf_unload_file()
1060 ef->progtab[i].size); in link_elf_unload_file()
1062 else if (!strcmp(ef->progtab[i].name, VNET_SETNAME)) in link_elf_unload_file()
1063 vnet_data_free(ef->progtab[i].addr, in link_elf_unload_file()
1064 ef->progtab[i].size); in link_elf_unload_file()
1068 if (ef->preloaded) { in link_elf_unload_file()
1069 free(ef->reltab, M_LINKER); in link_elf_unload_file()
1070 free(ef->relatab, M_LINKER); in link_elf_unload_file()
1071 free(ef->progtab, M_LINKER); in link_elf_unload_file()
1072 free(ef->ctftab, M_LINKER); in link_elf_unload_file()
1073 free(ef->ctfoff, M_LINKER); in link_elf_unload_file()
1074 free(ef->typoff, M_LINKER); in link_elf_unload_file()
1080 for (i = 0; i < ef->nreltab; i++) in link_elf_unload_file()
1081 free(ef->reltab[i].rel, M_LINKER); in link_elf_unload_file()
1082 for (i = 0; i < ef->nrelatab; i++) in link_elf_unload_file()
1083 free(ef->relatab[i].rela, M_LINKER); in link_elf_unload_file()
1084 free(ef->reltab, M_LINKER); in link_elf_unload_file()
1085 free(ef->relatab, M_LINKER); in link_elf_unload_file()
1086 free(ef->progtab, M_LINKER); in link_elf_unload_file()
1088 if (ef->object) { in link_elf_unload_file()
1089 vm_map_remove(kernel_map, (vm_offset_t) ef->address, in link_elf_unload_file()
1090 (vm_offset_t) ef->address + in link_elf_unload_file()
1091 (ef->object->size << PAGE_SHIFT)); in link_elf_unload_file()
1093 free(ef->e_shdr, M_LINKER); in link_elf_unload_file()
1094 free(ef->ddbsymtab, M_LINKER); in link_elf_unload_file()
1095 free(ef->ddbstrtab, M_LINKER); in link_elf_unload_file()
1096 free(ef->shstrtab, M_LINKER); in link_elf_unload_file()
1097 free(ef->ctftab, M_LINKER); in link_elf_unload_file()
1098 free(ef->ctfoff, M_LINKER); in link_elf_unload_file()
1099 free(ef->typoff, M_LINKER); in link_elf_unload_file()
1103 symbol_name(elf_file_t ef, Elf_Size r_info) in symbol_name() argument
1108 ref = ef->ddbsymtab + ELF_R_SYM(r_info); in symbol_name()
1109 return ef->ddbstrtab + ref->st_name; in symbol_name()
1115 findbase(elf_file_t ef, int sec) in findbase() argument
1120 for (i = 0; i < ef->nprogtab; i++) { in findbase()
1121 if (sec == ef->progtab[i].sec) { in findbase()
1122 base = (Elf_Addr)ef->progtab[i].addr; in findbase()
1130 relocate_file(elf_file_t ef) in relocate_file() argument
1144 for (i = 0; i < ef->nreltab; i++) { in relocate_file()
1145 rel = ef->reltab[i].rel; in relocate_file()
1147 link_elf_error(ef->lf.filename, "lost a reltab!"); in relocate_file()
1150 rellim = rel + ef->reltab[i].nrel; in relocate_file()
1151 base = findbase(ef, ef->reltab[i].sec); in relocate_file()
1153 link_elf_error(ef->lf.filename, "lost base for reltab"); in relocate_file()
1158 if (symidx >= ef->ddbsymcnt) in relocate_file()
1160 sym = ef->ddbsymtab + symidx; in relocate_file()
1164 if (elf_reloc(&ef->lf, base, rel, ELF_RELOC_REL, in relocate_file()
1166 symname = symbol_name(ef, rel->r_info); in relocate_file()
1175 for (i = 0; i < ef->nrelatab; i++) { in relocate_file()
1176 rela = ef->relatab[i].rela; in relocate_file()
1178 link_elf_error(ef->lf.filename, "lost a relatab!"); in relocate_file()
1181 relalim = rela + ef->relatab[i].nrela; in relocate_file()
1182 base = findbase(ef, ef->relatab[i].sec); in relocate_file()
1184 link_elf_error(ef->lf.filename, in relocate_file()
1190 if (symidx >= ef->ddbsymcnt) in relocate_file()
1192 sym = ef->ddbsymtab + symidx; in relocate_file()
1196 if (elf_reloc(&ef->lf, base, rela, ELF_RELOC_RELA, in relocate_file()
1198 symname = symbol_name(ef, rela->r_info); in relocate_file()
1211 elf_obj_cleanup_globals_cache(ef); in relocate_file()
1219 elf_file_t ef = (elf_file_t) lf; in link_elf_lookup_symbol() local
1224 for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) { in link_elf_lookup_symbol()
1225 strp = ef->ddbstrtab + symp->st_name; in link_elf_lookup_symbol()
1238 elf_file_t ef; in link_elf_symbol_values() local
1242 ef = (elf_file_t) lf; in link_elf_symbol_values()
1245 if (es >= ef->ddbsymtab && es < (ef->ddbsymtab + ef->ddbsymcnt)) { in link_elf_symbol_values()
1246 symval->name = ef->ddbstrtab + es->st_name; in link_elf_symbol_values()
1261 elf_file_t ef = (elf_file_t) lf; in link_elf_search_symbol() local
1269 for (i = 0, es = ef->ddbsymtab; i < ef->ddbsymcnt; i++, es++) { in link_elf_search_symbol()
1300 elf_file_t ef = (elf_file_t)lf; in link_elf_lookup_set() local
1305 for (i = 0; i < ef->nprogtab; i++) { in link_elf_lookup_set()
1306 if ((strncmp(ef->progtab[i].name, "set_", 4) == 0) && in link_elf_lookup_set()
1307 strcmp(ef->progtab[i].name + 4, name) == 0) { in link_elf_lookup_set()
1308 start = (void **)ef->progtab[i].addr; in link_elf_lookup_set()
1309 stop = (void **)((char *)ef->progtab[i].addr + in link_elf_lookup_set()
1310 ef->progtab[i].size); in link_elf_lookup_set()
1328 elf_file_t ef = (elf_file_t)file; in link_elf_each_function_name() local
1333 for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) { in link_elf_each_function_name()
1337 error = callback(ef->ddbstrtab + symp->st_name, opaque); in link_elf_each_function_name()
1350 elf_file_t ef = (elf_file_t)file; in link_elf_each_function_nameval() local
1355 for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) { in link_elf_each_function_nameval()
1372 elf_obj_cleanup_globals_cache(elf_file_t ef) in elf_obj_cleanup_globals_cache() argument
1377 for (i = 0; i < ef->ddbsymcnt; i++) { in elf_obj_cleanup_globals_cache()
1378 sym = ef->ddbsymtab + i; in elf_obj_cleanup_globals_cache()
1396 elf_file_t ef = (elf_file_t)lf; in elf_obj_lookup() local
1402 if (symidx >= ef->ddbsymcnt) { in elf_obj_lookup()
1407 sym = ef->ddbsymtab + symidx; in elf_obj_lookup()
1428 symbol = ef->ddbstrtab + sym->st_name; in elf_obj_lookup()
1465 link_elf_fix_link_set(elf_file_t ef) in link_elf_fix_link_set() argument
1477 symidx < ef->ddbsymcnt; symidx++) { in link_elf_fix_link_set()
1478 sym = ef->ddbsymtab + symidx; in link_elf_fix_link_set()
1482 sym_name = ef->ddbstrtab + sym->st_name; in link_elf_fix_link_set()
1494 for (i = 0; i < ef->nprogtab; i++) { in link_elf_fix_link_set()
1495 if (strcmp(ef->progtab[i].name, linkset_name) == 0) { in link_elf_fix_link_set()
1496 startp = (Elf_Addr)ef->progtab[i].addr; in link_elf_fix_link_set()
1497 stopp = (Elf_Addr)(startp + ef->progtab[i].size); in link_elf_fix_link_set()
1501 if (i == ef->nprogtab) in link_elf_fix_link_set()
1512 elf_file_t ef = (elf_file_t)lf; in link_elf_reloc_local() local
1522 link_elf_fix_link_set(ef); in link_elf_reloc_local()
1525 for (i = 0; i < ef->nreltab; i++) { in link_elf_reloc_local()
1526 rel = ef->reltab[i].rel; in link_elf_reloc_local()
1528 link_elf_error(ef->lf.filename, "lost a reltab"); in link_elf_reloc_local()
1531 rellim = rel + ef->reltab[i].nrel; in link_elf_reloc_local()
1532 base = findbase(ef, ef->reltab[i].sec); in link_elf_reloc_local()
1534 link_elf_error(ef->lf.filename, "lost base for reltab"); in link_elf_reloc_local()
1539 if (symidx >= ef->ddbsymcnt) in link_elf_reloc_local()
1541 sym = ef->ddbsymtab + symidx; in link_elf_reloc_local()
1553 for (i = 0; i < ef->nrelatab; i++) { in link_elf_reloc_local()
1554 rela = ef->relatab[i].rela; in link_elf_reloc_local()
1556 link_elf_error(ef->lf.filename, "lost a relatab!"); in link_elf_reloc_local()
1559 relalim = rela + ef->relatab[i].nrela; in link_elf_reloc_local()
1560 base = findbase(ef, ef->relatab[i].sec); in link_elf_reloc_local()
1562 link_elf_error(ef->lf.filename, "lost base for reltab"); in link_elf_reloc_local()
1567 if (symidx >= ef->ddbsymcnt) in link_elf_reloc_local()
1569 sym = ef->ddbsymtab + symidx; in link_elf_reloc_local()
1585 elf_file_t ef = (elf_file_t)lf; in link_elf_symtab_get() local
1587 *symtab = ef->ddbsymtab; in link_elf_symtab_get()
1592 return (ef->ddbsymcnt); in link_elf_symtab_get()
1598 elf_file_t ef = (elf_file_t)lf; in link_elf_strtab_get() local
1600 *strtab = ef->ddbstrtab; in link_elf_strtab_get()
1605 return (ef->ddbstrcnt); in link_elf_strtab_get()