Home | History | Annotate | Download | only in kern

Lines Matching defs:ko

108 	kobj_t ko;
110 ko = kmem_zalloc(sizeof(*ko), KM_SLEEP);
111 ko->ko_type = KT_MEMORY;
112 kobj_setname(ko, name);
113 ko->ko_source = base;
114 ko->ko_memsize = size;
115 ko->ko_read = kobj_read_mem;
116 ko->ko_close = kobj_close_mem;
118 *kop = ko;
119 return kobj_load(ko);
128 kobj_close(kobj_t ko)
131 if (ko->ko_source == NULL) {
135 ko->ko_close(ko);
136 ko->ko_source = NULL;
140 kobj_close_mem(kobj_t ko)
153 kobj_load(kobj_t ko)
173 KASSERT(ko->ko_type != KT_UNSET);
174 KASSERT(ko->ko_source != NULL);
183 error = ko->ko_read(ko, (void **)&hdr, sizeof(*hdr), 0, true);
185 kobj_error(ko, "read failed %d", error);
189 kobj_error(ko, "not an ELF object");
196 kobj_error(ko, "unsupported file version %d",
202 kobj_error(ko, "unsupported file type %d", hdr->e_type);
215 kobj_error(ko, "unsupported machine %d", hdr->e_machine);
220 ko->ko_nprogtab = 0;
221 ko->ko_shdr = 0;
222 ko->ko_nrel = 0;
223 ko->ko_nrela = 0;
230 kobj_error(ko, "bad sizes");
234 ko->ko_shdrsz = hdr->e_shnum * sizeof(Elf_Shdr);
235 error = ko->ko_read(ko, (void **)&shdr, ko->ko_shdrsz, hdr->e_shoff,
238 kobj_error(ko, "read failed %d", error);
241 ko->ko_shdr = shdr;
252 ko->ko_nprogtab++;
262 ko->ko_nrel++;
267 ko->ko_nrela++;
273 if (ko->ko_nprogtab == 0) {
274 kobj_error(ko, "file has no contents");
280 kobj_error(ko, "file has no valid symbol table");
289 kobj_error(ko, "file has invalid symbol strings");
297 if (ko->ko_nprogtab != 0) {
298 ko->ko_progtab = kmem_zalloc(ko->ko_nprogtab *
299 sizeof(*ko->ko_progtab), KM_SLEEP);
300 if (ko->ko_progtab == NULL) {
302 kobj_error(ko, "out of memory");
306 if (ko->ko_nrel != 0) {
307 ko->ko_reltab = kmem_zalloc(ko->ko_nrel *
308 sizeof(*ko->ko_reltab), KM_SLEEP);
309 if (ko->ko_reltab == NULL) {
311 kobj_error(ko, "out of memory");
315 if (ko->ko_nrela != 0) {
316 ko->ko_relatab = kmem_zalloc(ko->ko_nrela *
317 sizeof(*ko->ko_relatab), KM_SLEEP);
318 if (ko->ko_relatab == NULL) {
320 kobj_error(ko, "out of memory");
328 ko->ko_symcnt = shdr[symtabindex].sh_size / sizeof(Elf_Sym);
329 if (ko->ko_symcnt == 0) {
330 kobj_error(ko, "no symbol table");
334 error = ko->ko_read(ko, (void **)&ko->ko_symtab,
335 ko->ko_symcnt * sizeof(Elf_Sym),
338 kobj_error(ko, "read failed %d", error);
345 ko->ko_strtabsz = shdr[symstrindex].sh_size;
346 if (ko->ko_strtabsz == 0) {
347 kobj_error(ko, "no symbol strings");
351 error = ko->ko_read(ko, (void *)&ko->ko_strtab, ko->ko_strtabsz,
354 kobj_error(ko, "read failed %d", error);
361 error = kobj_renamespace(ko->ko_symtab, ko->ko_symcnt,
362 &ko->ko_strtab, &ko->ko_strtabsz);
364 kobj_error(ko, "renamespace failed %d", error);
373 kobj_error(ko, "bad shstrndx");
379 ko->ko_shstrtabsz = shdr[hdr->e_shstrndx].sh_size;
380 error = ko->ko_read(ko, (void **)&ko->ko_shstrtab,
384 kobj_error(ko, "read failed %d", error);
418 kobj_error(ko, "no text");
427 kobj_error(ko, "out of memory");
431 ko->ko_data_address = map_data_base;
432 ko->ko_data_size = map_data_size;
435 ko->ko_data_address = 0;
436 ko->ko_data_size = 0;
443 kobj_error(ko, "out of memory");
447 ko->ko_rodata_address = map_rodata_base;
448 ko->ko_rodata_size = map_rodata_size;
451 ko->ko_rodata_address = 0;
452 ko->ko_rodata_size = 0;
458 kobj_error(ko, "out of memory");
462 ko->ko_text_address = map_text_base;
463 ko->ko_text_size = map_text_size;
495 ko->ko_progtab[pb].addr = addr;
497 ko->ko_progtab[pb].name = "<<PROGBITS>>";
498 error = ko->ko_read(ko, &addr,
501 kobj_error(ko, "read failed %d", error);
505 ko->ko_progtab[pb].name = "<<NOBITS>>";
509 ko->ko_progtab[pb].size = shdr[i].sh_size;
510 ko->ko_progtab[pb].sec = i;
511 if (ko->ko_shstrtab != NULL && shdr[i].sh_name != 0) {
512 ko->ko_progtab[pb].name =
513 ko->ko_shstrtab + shdr[i].sh_name;
517 for (j = 0; j < ko->ko_symcnt; j++) {
518 es = &ko->ko_symtab[j];
529 ko->ko_reltab[rl].size = shdr[i].sh_size;
530 ko->ko_reltab[rl].size -=
532 if (ko->ko_reltab[rl].size != 0) {
533 ko->ko_reltab[rl].nrel =
535 ko->ko_reltab[rl].sec = shdr[i].sh_info;
536 error = ko->ko_read(ko,
537 (void **)&ko->ko_reltab[rl].rel,
538 ko->ko_reltab[rl].size,
541 kobj_error(ko, "read failed %d",
551 ko->ko_relatab[ra].size = shdr[i].sh_size;
552 ko->ko_relatab[ra].size -=
554 if (ko->ko_relatab[ra].size != 0) {
555 ko->ko_relatab[ra].nrela =
557 ko->ko_relatab[ra].sec = shdr[i].sh_info;
558 error = ko->ko_read(ko,
559 (void **)&ko->ko_relatab[ra].rela,
563 kobj_error(ko, "read failed %d", error);
573 if (pb != ko->ko_nprogtab) {
575 ko->ko_name);
577 if (rl != ko->ko_nrel) {
579 ko->ko_name);
581 if (ra != ko->ko_nrela) {
583 ko->ko_name);
585 if (map_text_base != ko->ko_text_address + map_text_size) {
588 __func__, __LINE__, ko->ko_name, (long)map_text_base,
589 (long)ko->ko_text_address, (long)map_text_size,
590 (long)ko->ko_text_address + map_text_size);
592 if (map_data_base != ko->ko_data_address + map_data_size) {
595 __func__, __LINE__, ko->ko_name, (long)map_data_base,
596 (long)ko->ko_data_address, (long)map_data_size,
597 (long)ko->ko_data_address + map_data_size);
599 if (map_rodata_base != ko->ko_rodata_address + map_rodata_size) {
602 __func__, __LINE__, ko->ko_name, (long)map_rodata_base,
603 (long)ko->ko_rodata_address, (long)map_rodata_size,
604 (long)ko->ko_rodata_address + map_rodata_size);
611 error = kobj_checksyms(ko, false);
615 ko, true);
620 kobj_free(ko, hdr, sizeof(*hdr));
622 kobj_close(ko);
624 kobj_unload(ko);
631 kobj_unload_notify(kobj_t ko, vaddr_t addr, size_t size, const char *note)
636 int error = kobj_machdep(ko, (void *)addr, size, false);
638 kobj_error(ko, "machine dependent deinit failed (%s) %d",
642 #define KOBJ_SEGMENT_NOTIFY(ko, what) \
643 kobj_unload_notify(ko, (ko)->ko_ ## what ## _address, \
644 (ko)->ko_ ## what ## _size, # what);
646 #define KOBJ_SEGMENT_FREE(ko, what) \
648 if ((ko)->ko_ ## what ## _address != 0) \
649 uvm_km_free(module_map, (ko)->ko_ ## what ## _address, \
650 round_page((ko)->ko_ ## what ## _size), UVM_KMF_WIRED); \
659 kobj_unload(kobj_t ko)
661 kobj_close(ko);
662 kobj_jettison(ko);
668 if (ko->ko_loaded) {
669 KOBJ_SEGMENT_NOTIFY(ko, text);
670 KOBJ_SEGMENT_NOTIFY(ko, data);
671 KOBJ_SEGMENT_NOTIFY(ko, rodata);
674 KOBJ_SEGMENT_FREE(ko, text);
675 KOBJ_SEGMENT_FREE(ko, data);
676 KOBJ_SEGMENT_FREE(ko, rodata);
678 if (ko->ko_ksyms == true) {
679 ksyms_modunload(ko->ko_name);
681 if (ko->ko_symtab != NULL) {
682 kobj_free(ko, ko->ko_symtab, ko->ko_symcnt * sizeof(Elf_Sym));
684 if (ko->ko_strtab != NULL) {
685 kobj_free(ko, ko->ko_strtab, ko->ko_strtabsz);
687 if (ko->ko_progtab != NULL) {
688 kobj_free(ko, ko->ko_progtab, ko->ko_nprogtab *
689 sizeof(*ko->ko_progtab));
690 ko->ko_progtab = NULL;
692 if (ko->ko_shstrtab) {
693 kobj_free(ko, ko->ko_shstrtab, ko->ko_shstrtabsz);
694 ko->ko_shstrtab = NULL;
697 kmem_free(ko, sizeof(*ko));
706 kobj_stat(kobj_t ko, vaddr_t *address, size_t *size)
710 *address = ko->ko_text_address;
713 *size = ko->ko_text_size;
725 kobj_affix(kobj_t ko, const char *name)
729 KASSERT(ko->ko_ksyms == false);
730 KASSERT(ko->ko_loaded == false);
732 kobj_setname(ko, name);
735 error = kobj_checksyms(ko, true);
740 error = kobj_relocate(ko, false);
749 ksyms_modload(ko->ko_name, ko->ko_symtab,
750 ko->ko_symcnt * sizeof(Elf_Sym), ko->ko_strtab, ko->ko_strtabsz);
751 ko->ko_ksyms = true;
754 kobj_jettison(ko);
761 if (ko->ko_text_address != 0) {
762 error = kobj_machdep(ko, (void *)ko->ko_text_address,
763 ko->ko_text_size, true);
765 kobj_error(ko, "machine dependent init failed (text)"
771 if (ko->ko_data_address != 0) {
772 error = kobj_machdep(ko, (void *)ko->ko_data_address,
773 ko->ko_data_size, true);
775 kobj_error(ko, "machine dependent init failed (data)"
781 if (ko->ko_rodata_address != 0) {
782 error = kobj_machdep(ko, (void *)ko->ko_rodata_address,
783 ko->ko_rodata_size, true);
785 kobj_error(ko, "machine dependent init failed (rodata)"
791 ko->ko_loaded = true;
794 if (ko->ko_text_address != 0) {
795 uvm_km_protect(module_map, ko->ko_text_address,
796 ko->ko_text_size, VM_PROT_READ|VM_PROT_EXECUTE);
798 if (ko->ko_rodata_address != 0) {
799 uvm_km_protect(module_map, ko->ko_rodata_address,
800 ko->ko_rodata_size, VM_PROT_READ);
808 kobj_unload(ko);
820 kobj_find_section(kobj_t ko, const char *name, void **addr, size_t *size)
824 KASSERT(ko->ko_progtab != NULL);
826 for (i = 0; i < ko->ko_nprogtab; i++) {
827 if (strcmp(ko->ko_progtab[i].name, name) == 0) {
829 *addr = ko->ko_progtab[i].addr;
832 *size = ko->ko_progtab[i].size;
847 kobj_jettison(kobj_t ko)
851 if (ko->ko_reltab != NULL) {
852 for (i = 0; i < ko->ko_nrel; i++) {
853 if (ko->ko_reltab[i].rel) {
854 kobj_free(ko, ko->ko_reltab[i].rel,
855 ko->ko_reltab[i].size);
858 kobj_free(ko, ko->ko_reltab, ko->ko_nrel *
859 sizeof(*ko->ko_reltab));
860 ko->ko_reltab = NULL;
861 ko->ko_nrel = 0;
863 if (ko->ko_relatab != NULL) {
864 for (i = 0; i < ko->ko_nrela; i++) {
865 if (ko->ko_relatab[i].rela) {
866 kobj_free(ko, ko->ko_relatab[i].rela,
867 ko->ko_relatab[i].size);
870 kobj_free(ko, ko->ko_relatab, ko->ko_nrela *
871 sizeof(*ko->ko_relatab));
872 ko->ko_relatab = NULL;
873 ko->ko_nrela = 0;
875 if (ko->ko_shdr != NULL) {
876 kobj_free(ko, ko->ko_shdr, ko->ko_shdrsz);
877 ko->ko_shdr = NULL;
882 kobj_symbol(kobj_t ko, uintptr_t symidx)
885 return ko->ko_symtab + symidx;
896 kobj_sym_lookup(kobj_t ko, uintptr_t symidx, Elf_Addr *val)
901 sym = ko->ko_symtab + symidx;
906 } else if (symidx >= ko->ko_symcnt) {
911 kobj_error(ko, "symbol index %ju out of range",
926 kobj_error(ko, "local symbol @%ju undefined",
932 symbol = ko->ko_strtab + sym->st_name;
936 kobj_error(ko, "bad symbol @%ju name",
941 kobj_error(ko, "%s @%ju: bad value", symbol,
950 kobj_error(ko, "weak symbol @%ju not supported",
955 kobj_error(ko, "bad binding %#x for symbol @%ju",
967 kobj_findbase(kobj_t ko, int sec)
971 for (i = 0; i < ko->ko_nprogtab; i++) {
972 if (sec == ko->ko_progtab[i].sec) {
973 return (uintptr_t)ko->ko_progtab[i].addr;
986 kobj_checksyms(kobj_t ko, bool undefined)
995 for (ms = (sym = ko->ko_symtab) + ko->ko_symcnt; sym < ms; sym++) {
1009 name = ko->ko_strtab + sym->st_name;
1013 kobj_error(ko, "symbol `%s' not found",
1045 kobj_error(ko, "global symbol `%s' redefined",
1059 kobj_relocate(kobj_t ko, bool local)
1073 for (i = 0; i < ko->ko_nrel; i++) {
1074 rel = ko->ko_reltab[i].rel;
1078 rellim = rel + ko->ko_reltab[i].nrel;
1079 base = kobj_findbase(ko, ko->ko_reltab[i].sec);
1082 __func__, __LINE__, ko->ko_name, i,
1083 ko->ko_reltab[i].sec);
1087 if (symidx >= ko->ko_symcnt) {
1090 sym = ko->ko_symtab + symidx;
1095 error = kobj_reloc(ko, base, rel, false, local);
1097 kobj_error(ko, "unresolved rel relocation "
1110 for (i = 0; i < ko->ko_nrela; i++) {
1111 rela = ko->ko_relatab[i].rela;
1115 relalim = rela + ko->ko_relatab[i].nrela;
1116 base = kobj_findbase(ko, ko->ko_relatab[i].sec);
1119 __func__, __LINE__, ko->ko_name, i,
1120 ko->ko_relatab[i].sec);
1124 if (symidx >= ko->ko_symcnt) {
1127 sym = ko->ko_symtab + symidx;
1132 error = kobj_reloc(ko, base, rela, true, local);
1134 kobj_error(ko, "unresolved rela relocation "
1153 kobj_out(const char *fname, int lnum, kobj_t ko, const char *fmt, ...)
1157 printf("%s, %d: [%s]: linker error: ", fname, lnum, ko->ko_name);
1165 kobj_read_mem(kobj_t ko, void **basep, size_t size, off_t off,
1171 KASSERT(ko->ko_source != NULL);
1174 kobj_error(ko, "negative offset %lld",
1179 } else if (ko->ko_memsize != -1 &&
1180 (size > ko->ko_memsize || off > ko->ko_memsize - size)) {
1181 kobj_error(ko, "preloaded object short");
1191 memcpy(base, (uint8_t *)ko->ko_source + off, size);
1204 kobj_free(kobj_t ko, void *base, size_t size)
1211 kobj_setname(kobj_t ko, const char *name)
1225 if (len >= sizeof(ko->ko_name)) {
1226 len = (len - sizeof(ko->ko_name)) + 5; /* dots + NUL */
1232 snprintf(ko->ko_name, sizeof(ko->ko_name), "%s%s%s", name, dots, d);
1245 kobj_unload(kobj_t ko)
1252 kobj_stat(kobj_t ko, vaddr_t *base, size_t *size)
1259 kobj_affix(kobj_t ko, const char *name)
1266 kobj_find_section(kobj_t ko, const char *name, void **addr, size_t *size)
1273 kobj_setname(kobj_t ko, const char *name)