subr_kobj.c revision 1.36 1 /* $NetBSD: subr_kobj.c,v 1.36 2009/05/24 15:00:24 ad Exp $ */
2
3 /*-
4 * Copyright (c) 2008 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software developed for The NetBSD Foundation
8 * by Andrew Doran.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32 /*-
33 * Copyright (c) 1998-2000 Doug Rabson
34 * Copyright (c) 2004 Peter Wemm
35 * All rights reserved.
36 *
37 * Redistribution and use in source and binary forms, with or without
38 * modification, are permitted provided that the following conditions
39 * are met:
40 * 1. Redistributions of source code must retain the above copyright
41 * notice, this list of conditions and the following disclaimer.
42 * 2. Redistributions in binary form must reproduce the above copyright
43 * notice, this list of conditions and the following disclaimer in the
44 * documentation and/or other materials provided with the distribution.
45 *
46 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
47 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
48 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
49 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
50 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
51 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
52 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
53 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
54 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
55 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
56 * SUCH DAMAGE.
57 */
58
59 /*
60 * Kernel loader for ELF objects.
61 *
62 * TODO: adjust kmem_alloc() calls to avoid needless fragmentation.
63 */
64
65 #include <sys/cdefs.h>
66 __KERNEL_RCSID(0, "$NetBSD: subr_kobj.c,v 1.36 2009/05/24 15:00:24 ad Exp $");
67
68 #include "opt_modular.h"
69
70 #include <sys/kobj_impl.h>
71
72 #ifdef MODULAR
73
74 #include <sys/param.h>
75 #include <sys/kernel.h>
76 #include <sys/kmem.h>
77 #include <sys/proc.h>
78 #include <sys/namei.h>
79 #include <sys/vnode.h>
80 #include <sys/fcntl.h>
81 #include <sys/ksyms.h>
82 #include <sys/module.h>
83
84 #include <machine/stdarg.h>
85
86 #include <uvm/uvm_extern.h>
87
88 static int kobj_relocate(kobj_t, bool);
89 static int kobj_checksyms(kobj_t, bool);
90 static void kobj_error(const char *, ...);
91 static int kobj_read(kobj_t, void **, size_t, off_t);
92 static int kobj_read_bits(kobj_t, void *, size_t, off_t);
93 static void kobj_jettison(kobj_t);
94 static void kobj_free(kobj_t, void *, size_t);
95 static void kobj_close(kobj_t);
96 static int kobj_load(kobj_t);
97
98 extern struct vm_map *module_map;
99
100 /*
101 * kobj_load_file:
102 *
103 * Load an object located in the file system.
104 */
105 int
106 kobj_load_file(kobj_t *kop, const char *filename, const char *base,
107 bool autoload)
108 {
109 struct nameidata nd;
110 kauth_cred_t cred;
111 char *path;
112 int error;
113 kobj_t ko;
114
115 cred = kauth_cred_get();
116
117 ko = kmem_zalloc(sizeof(*ko), KM_SLEEP);
118 if (ko == NULL) {
119 return ENOMEM;
120 }
121
122 if (autoload) {
123 error = ENOENT;
124 } else {
125 NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, filename);
126 error = vn_open(&nd, FREAD, 0);
127 }
128 if (error != 0) {
129 if (error != ENOENT) {
130 goto out;
131 }
132 path = PNBUF_GET();
133 snprintf(path, MAXPATHLEN - 1, "%s/%s/%s.kmod", base,
134 filename, filename);
135 NDINIT(&nd, LOOKUP, FOLLOW | NOCHROOT, UIO_SYSSPACE, path);
136 error = vn_open(&nd, FREAD, 0);
137 PNBUF_PUT(path);
138 }
139
140 out:
141 if (error != 0) {
142 kmem_free(ko, sizeof(*ko));
143 return error;
144 }
145
146 ko->ko_type = KT_VNODE;
147 ko->ko_source = nd.ni_vp;
148 *kop = ko;
149 return kobj_load(ko);
150 }
151
152 /*
153 * kobj_load_mem:
154 *
155 * Load an object already resident in memory. If size is not -1,
156 * the complete size of the object is known.
157 */
158 int
159 kobj_load_mem(kobj_t *kop, void *base, ssize_t size)
160 {
161 kobj_t ko;
162
163 ko = kmem_zalloc(sizeof(*ko), KM_SLEEP);
164 if (ko == NULL) {
165 return ENOMEM;
166 }
167
168 ko->ko_type = KT_MEMORY;
169 ko->ko_source = base;
170 ko->ko_memsize = size;
171 *kop = ko;
172 return kobj_load(ko);
173 }
174
175 /*
176 * kobj_close:
177 *
178 * Close an open ELF object.
179 */
180 static void
181 kobj_close(kobj_t ko)
182 {
183
184 if (ko->ko_source == NULL) {
185 return;
186 }
187
188 switch (ko->ko_type) {
189 case KT_VNODE:
190 VOP_UNLOCK(ko->ko_source, 0);
191 vn_close(ko->ko_source, FREAD, kauth_cred_get());
192 break;
193 case KT_MEMORY:
194 /* nothing */
195 break;
196 default:
197 panic("kobj_close: unknown type");
198 break;
199 }
200
201 ko->ko_source = NULL;
202 }
203
204 /*
205 * kobj_load:
206 *
207 * Load an ELF object and prepare to link into the running kernel
208 * image.
209 */
210 static int
211 kobj_load(kobj_t ko)
212 {
213 Elf_Ehdr *hdr;
214 Elf_Shdr *shdr;
215 Elf_Sym *es;
216 vaddr_t mapbase;
217 size_t mapsize;
218 int error;
219 int symtabindex;
220 int symstrindex;
221 int nsym;
222 int pb, rl, ra;
223 int alignmask;
224 int i, j;
225 void *addr;
226
227 KASSERT(ko->ko_type != KT_UNSET);
228 KASSERT(ko->ko_source != NULL);
229
230 shdr = NULL;
231 mapsize = 0;
232 error = 0;
233 hdr = NULL;
234
235 /*
236 * Read the elf header from the file.
237 */
238 error = kobj_read(ko, (void **)&hdr, sizeof(*hdr), 0);
239 if (error != 0)
240 goto out;
241 if (memcmp(hdr->e_ident, ELFMAG, SELFMAG) != 0) {
242 kobj_error("not an ELF object");
243 error = ENOEXEC;
244 goto out;
245 }
246
247 if (hdr->e_ident[EI_VERSION] != EV_CURRENT ||
248 hdr->e_version != EV_CURRENT) {
249 kobj_error("unsupported file version");
250 error = ENOEXEC;
251 goto out;
252 }
253 if (hdr->e_type != ET_REL) {
254 kobj_error("unsupported file type");
255 error = ENOEXEC;
256 goto out;
257 }
258 switch (hdr->e_machine) {
259 #if ELFSIZE == 32
260 ELF32_MACHDEP_ID_CASES
261 #else
262 ELF64_MACHDEP_ID_CASES
263 #endif
264 default:
265 kobj_error("unsupported machine");
266 error = ENOEXEC;
267 goto out;
268 }
269
270 ko->ko_nprogtab = 0;
271 ko->ko_shdr = 0;
272 ko->ko_nrel = 0;
273 ko->ko_nrela = 0;
274
275 /*
276 * Allocate and read in the section header.
277 */
278 ko->ko_shdrsz = hdr->e_shnum * hdr->e_shentsize;
279 if (ko->ko_shdrsz == 0 || hdr->e_shoff == 0 ||
280 hdr->e_shentsize != sizeof(Elf_Shdr)) {
281 error = ENOEXEC;
282 goto out;
283 }
284 error = kobj_read(ko, (void **)&shdr, ko->ko_shdrsz, hdr->e_shoff);
285 if (error != 0) {
286 goto out;
287 }
288 ko->ko_shdr = shdr;
289
290 /*
291 * Scan the section header for information and table sizing.
292 */
293 nsym = 0;
294 symtabindex = -1;
295 symstrindex = -1;
296 for (i = 0; i < hdr->e_shnum; i++) {
297 switch (shdr[i].sh_type) {
298 case SHT_PROGBITS:
299 case SHT_NOBITS:
300 ko->ko_nprogtab++;
301 break;
302 case SHT_SYMTAB:
303 nsym++;
304 symtabindex = i;
305 symstrindex = shdr[i].sh_link;
306 break;
307 case SHT_REL:
308 ko->ko_nrel++;
309 break;
310 case SHT_RELA:
311 ko->ko_nrela++;
312 break;
313 case SHT_STRTAB:
314 break;
315 }
316 }
317 if (ko->ko_nprogtab == 0) {
318 kobj_error("file has no contents");
319 error = ENOEXEC;
320 goto out;
321 }
322 if (nsym != 1) {
323 /* Only allow one symbol table for now */
324 kobj_error("file has no valid symbol table");
325 error = ENOEXEC;
326 goto out;
327 }
328 if (symstrindex < 0 || symstrindex > hdr->e_shnum ||
329 shdr[symstrindex].sh_type != SHT_STRTAB) {
330 kobj_error("file has invalid symbol strings");
331 error = ENOEXEC;
332 goto out;
333 }
334
335 /*
336 * Allocate space for tracking the load chunks.
337 */
338 if (ko->ko_nprogtab != 0) {
339 ko->ko_progtab = kmem_zalloc(ko->ko_nprogtab *
340 sizeof(*ko->ko_progtab), KM_SLEEP);
341 if (ko->ko_progtab == NULL) {
342 error = ENOMEM;
343 goto out;
344 }
345 }
346 if (ko->ko_nrel != 0) {
347 ko->ko_reltab = kmem_zalloc(ko->ko_nrel *
348 sizeof(*ko->ko_reltab), KM_SLEEP);
349 if (ko->ko_reltab == NULL) {
350 error = ENOMEM;
351 goto out;
352 }
353 }
354 if (ko->ko_nrela != 0) {
355 ko->ko_relatab = kmem_zalloc(ko->ko_nrela *
356 sizeof(*ko->ko_relatab), KM_SLEEP);
357 if (ko->ko_relatab == NULL) {
358 error = ENOMEM;
359 goto out;
360 }
361 }
362 if (symtabindex == -1) {
363 kobj_error("lost symbol table index");
364 goto out;
365 }
366
367 /*
368 * Allocate space for and load the symbol table.
369 */
370 ko->ko_symcnt = shdr[symtabindex].sh_size / sizeof(Elf_Sym);
371 if (ko->ko_symcnt == 0) {
372 kobj_error("no symbol table");
373 goto out;
374 }
375 error = kobj_read(ko, (void **)&ko->ko_symtab,
376 ko->ko_symcnt * sizeof(Elf_Sym),
377 shdr[symtabindex].sh_offset);
378 if (error != 0) {
379 goto out;
380 }
381
382 /*
383 * Allocate space for and load the symbol strings.
384 */
385 ko->ko_strtabsz = shdr[symstrindex].sh_size;
386 if (ko->ko_strtabsz == 0) {
387 kobj_error("no symbol strings");
388 goto out;
389 }
390 error = kobj_read(ko, (void *)&ko->ko_strtab, ko->ko_strtabsz,
391 shdr[symstrindex].sh_offset);
392 if (error != 0) {
393 goto out;
394 }
395
396 /*
397 * Do we have a string table for the section names?
398 */
399 if (hdr->e_shstrndx != 0 && shdr[hdr->e_shstrndx].sh_size != 0 &&
400 shdr[hdr->e_shstrndx].sh_type == SHT_STRTAB) {
401 ko->ko_shstrtabsz = shdr[hdr->e_shstrndx].sh_size;
402 error = kobj_read(ko, (void **)&ko->ko_shstrtab,
403 shdr[hdr->e_shstrndx].sh_size,
404 shdr[hdr->e_shstrndx].sh_offset);
405 if (error != 0) {
406 goto out;
407 }
408 }
409
410 /*
411 * Size up code/data(progbits) and bss(nobits).
412 */
413 alignmask = 0;
414 mapbase = 0;
415 for (i = 0; i < hdr->e_shnum; i++) {
416 switch (shdr[i].sh_type) {
417 case SHT_PROGBITS:
418 case SHT_NOBITS:
419 if (mapbase == 0)
420 mapbase = shdr[i].sh_offset;
421 alignmask = shdr[i].sh_addralign - 1;
422 mapsize += alignmask;
423 mapsize &= ~alignmask;
424 mapsize += shdr[i].sh_size;
425 break;
426 }
427 }
428
429 /*
430 * We know how much space we need for the text/data/bss/etc.
431 * This stuff needs to be in a single chunk so that profiling etc
432 * can get the bounds and gdb can associate offsets with modules.
433 */
434 if (mapsize == 0) {
435 kobj_error("no text/data/bss");
436 goto out;
437 }
438 if (ko->ko_type == KT_MEMORY) {
439 mapbase += (vaddr_t)ko->ko_source;
440 } else {
441 mapbase = uvm_km_alloc(module_map, round_page(mapsize),
442 0, UVM_KMF_WIRED | UVM_KMF_EXEC);
443 if (mapbase == 0) {
444 error = ENOMEM;
445 goto out;
446 }
447 }
448 ko->ko_address = mapbase;
449 ko->ko_size = mapsize;
450
451 /*
452 * Now load code/data(progbits), zero bss(nobits), allocate space
453 * for and load relocs
454 */
455 pb = 0;
456 rl = 0;
457 ra = 0;
458 alignmask = 0;
459 for (i = 0; i < hdr->e_shnum; i++) {
460 switch (shdr[i].sh_type) {
461 case SHT_PROGBITS:
462 case SHT_NOBITS:
463 alignmask = shdr[i].sh_addralign - 1;
464 if (ko->ko_type == KT_MEMORY) {
465 addr = (void *)(shdr[i].sh_offset +
466 (vaddr_t)ko->ko_source);
467 if (((vaddr_t)addr & alignmask) != 0) {
468 kobj_error("section %d not aligned\n",
469 i);
470 goto out;
471 }
472 } else {
473 mapbase += alignmask;
474 mapbase &= ~alignmask;
475 addr = (void *)mapbase;
476 mapbase += shdr[i].sh_size;
477 }
478 ko->ko_progtab[pb].addr = addr;
479 if (shdr[i].sh_type == SHT_PROGBITS) {
480 ko->ko_progtab[pb].name = "<<PROGBITS>>";
481 error = kobj_read_bits(ko, addr,
482 shdr[i].sh_size, shdr[i].sh_offset);
483 if (error != 0) {
484 goto out;
485 }
486 } else if (ko->ko_type == KT_MEMORY &&
487 shdr[i].sh_size != 0) {
488 kobj_error("non-loadable BSS section in "
489 "pre-loaded module");
490 error = EINVAL;
491 goto out;
492 } else {
493 ko->ko_progtab[pb].name = "<<NOBITS>>";
494 memset(addr, 0, shdr[i].sh_size);
495 }
496 ko->ko_progtab[pb].size = shdr[i].sh_size;
497 ko->ko_progtab[pb].sec = i;
498 if (ko->ko_shstrtab != NULL && shdr[i].sh_name != 0) {
499 ko->ko_progtab[pb].name =
500 ko->ko_shstrtab + shdr[i].sh_name;
501 }
502
503 /* Update all symbol values with the offset. */
504 for (j = 0; j < ko->ko_symcnt; j++) {
505 es = &ko->ko_symtab[j];
506 if (es->st_shndx != i) {
507 continue;
508 }
509 es->st_value += (Elf_Addr)addr;
510 }
511 pb++;
512 break;
513 case SHT_REL:
514 ko->ko_reltab[rl].size = shdr[i].sh_size;
515 ko->ko_reltab[rl].size -=
516 shdr[i].sh_size % sizeof(Elf_Rel);
517 if (ko->ko_reltab[rl].size != 0) {
518 ko->ko_reltab[rl].nrel =
519 shdr[i].sh_size / sizeof(Elf_Rel);
520 ko->ko_reltab[rl].sec = shdr[i].sh_info;
521 error = kobj_read(ko,
522 (void **)&ko->ko_reltab[rl].rel,
523 ko->ko_reltab[rl].size,
524 shdr[i].sh_offset);
525 if (error != 0) {
526 goto out;
527 }
528 }
529 rl++;
530 break;
531 case SHT_RELA:
532 ko->ko_relatab[ra].size = shdr[i].sh_size;
533 ko->ko_relatab[ra].size -=
534 shdr[i].sh_size % sizeof(Elf_Rela);
535 if (ko->ko_relatab[ra].size != 0) {
536 ko->ko_relatab[ra].nrela =
537 shdr[i].sh_size / sizeof(Elf_Rela);
538 ko->ko_relatab[ra].sec = shdr[i].sh_info;
539 error = kobj_read(ko,
540 (void **)&ko->ko_relatab[ra].rela,
541 shdr[i].sh_size,
542 shdr[i].sh_offset);
543 if (error != 0) {
544 goto out;
545 }
546 }
547 ra++;
548 break;
549 default:
550 break;
551 }
552 }
553 if (pb != ko->ko_nprogtab) {
554 panic("lost progbits");
555 }
556 if (rl != ko->ko_nrel) {
557 panic("lost rel");
558 }
559 if (ra != ko->ko_nrela) {
560 panic("lost rela");
561 }
562 if (ko->ko_type != KT_MEMORY && mapbase != ko->ko_address + mapsize) {
563 panic("mapbase 0x%lx != address %lx + mapsize %ld (0x%lx)\n",
564 (long)mapbase, (long)ko->ko_address, (long)mapsize,
565 (long)ko->ko_address + mapsize);
566 }
567
568 /*
569 * Perform local relocations only. Relocations relating to global
570 * symbols will be done by kobj_affix().
571 */
572 error = kobj_checksyms(ko, false);
573 if (error == 0) {
574 error = kobj_relocate(ko, true);
575 }
576 out:
577 if (hdr != NULL) {
578 kobj_free(ko, hdr, sizeof(*hdr));
579 }
580 kobj_close(ko);
581 if (error != 0) {
582 kobj_unload(ko);
583 }
584
585 return error;
586 }
587
588 /*
589 * kobj_unload:
590 *
591 * Unload an object previously loaded by kobj_load().
592 */
593 void
594 kobj_unload(kobj_t ko)
595 {
596 int error;
597
598 kobj_close(ko);
599 kobj_jettison(ko);
600
601 /*
602 * Notify MD code that a module has been unloaded.
603 */
604 if (ko->ko_loaded) {
605 error = kobj_machdep(ko, (void *)ko->ko_address, ko->ko_size,
606 false);
607 if (error != 0) {
608 kobj_error("machine dependent deinit failed");
609 }
610 }
611 if (ko->ko_address != 0 && ko->ko_type != KT_MEMORY) {
612 uvm_km_free(module_map, ko->ko_address, round_page(ko->ko_size),
613 UVM_KMF_WIRED);
614 }
615 if (ko->ko_ksyms == true) {
616 ksyms_modunload(ko->ko_name);
617 }
618 if (ko->ko_symtab != NULL) {
619 kobj_free(ko, ko->ko_symtab, ko->ko_symcnt * sizeof(Elf_Sym));
620 }
621 if (ko->ko_strtab != NULL) {
622 kobj_free(ko, ko->ko_strtab, ko->ko_strtabsz);
623 }
624 if (ko->ko_progtab != NULL) {
625 kobj_free(ko, ko->ko_progtab, ko->ko_nprogtab *
626 sizeof(*ko->ko_progtab));
627 ko->ko_progtab = NULL;
628 }
629 if (ko->ko_shstrtab) {
630 kobj_free(ko, ko->ko_shstrtab, ko->ko_shstrtabsz);
631 ko->ko_shstrtab = NULL;
632 }
633
634 kmem_free(ko, sizeof(*ko));
635 }
636
637 /*
638 * kobj_stat:
639 *
640 * Return size and load address of an object.
641 */
642 void
643 kobj_stat(kobj_t ko, vaddr_t *address, size_t *size)
644 {
645
646 if (address != NULL) {
647 *address = ko->ko_address;
648 }
649 if (size != NULL) {
650 *size = ko->ko_size;
651 }
652 }
653
654 /*
655 * kobj_affix:
656 *
657 * Set an object's name and perform global relocs. May only be
658 * called after the module and any requisite modules are loaded.
659 */
660 int
661 kobj_affix(kobj_t ko, const char *name)
662 {
663 int error;
664
665 KASSERT(ko->ko_ksyms == false);
666 KASSERT(ko->ko_loaded == false);
667
668 strlcpy(ko->ko_name, name, sizeof(ko->ko_name));
669
670 /* Cache addresses of undefined symbols. */
671 error = kobj_checksyms(ko, true);
672
673 /* Now do global relocations. */
674 if (error == 0)
675 error = kobj_relocate(ko, false);
676
677 /*
678 * Now that we know the name, register the symbol table.
679 * Do after global relocations because ksyms will pack
680 * the table.
681 */
682 if (error == 0) {
683 ksyms_modload(ko->ko_name, ko->ko_symtab, ko->ko_symcnt *
684 sizeof(Elf_Sym), ko->ko_strtab, ko->ko_strtabsz);
685 ko->ko_ksyms = true;
686 }
687
688 /* Jettison unneeded memory post-link. */
689 kobj_jettison(ko);
690
691 /*
692 * Notify MD code that a module has been loaded.
693 *
694 * Most architectures use this opportunity to flush their caches.
695 */
696 if (error == 0) {
697 error = kobj_machdep(ko, (void *)ko->ko_address, ko->ko_size,
698 true);
699 if (error != 0) {
700 kobj_error("machine dependent init failed");
701 }
702 ko->ko_loaded = true;
703 }
704
705 /* If there was an error, destroy the whole object. */
706 if (error != 0) {
707 kobj_unload(ko);
708 }
709
710 return error;
711 }
712
713 /*
714 * kobj_find_section:
715 *
716 * Given a section name, search the loaded object and return
717 * virtual address if present and loaded.
718 */
719 int
720 kobj_find_section(kobj_t ko, const char *name, void **addr, size_t *size)
721 {
722 int i;
723
724 KASSERT(ko->ko_progtab != NULL);
725
726 for (i = 0; i < ko->ko_nprogtab; i++) {
727 if (strcmp(ko->ko_progtab[i].name, name) == 0) {
728 if (addr != NULL) {
729 *addr = ko->ko_progtab[i].addr;
730 }
731 if (size != NULL) {
732 *size = ko->ko_progtab[i].size;
733 }
734 return 0;
735 }
736 }
737
738 return ENOENT;
739 }
740
741 /*
742 * kobj_jettison:
743 *
744 * Release object data not needed after performing relocations.
745 */
746 static void
747 kobj_jettison(kobj_t ko)
748 {
749 int i;
750
751 if (ko->ko_reltab != NULL) {
752 for (i = 0; i < ko->ko_nrel; i++) {
753 if (ko->ko_reltab[i].rel) {
754 kobj_free(ko, ko->ko_reltab[i].rel,
755 ko->ko_reltab[i].size);
756 }
757 }
758 kobj_free(ko, ko->ko_reltab, ko->ko_nrel *
759 sizeof(*ko->ko_reltab));
760 ko->ko_reltab = NULL;
761 ko->ko_nrel = 0;
762 }
763 if (ko->ko_relatab != NULL) {
764 for (i = 0; i < ko->ko_nrela; i++) {
765 if (ko->ko_relatab[i].rela) {
766 kobj_free(ko, ko->ko_relatab[i].rela,
767 ko->ko_relatab[i].size);
768 }
769 }
770 kobj_free(ko, ko->ko_relatab, ko->ko_nrela *
771 sizeof(*ko->ko_relatab));
772 ko->ko_relatab = NULL;
773 ko->ko_nrela = 0;
774 }
775 if (ko->ko_shdr != NULL) {
776 kobj_free(ko, ko->ko_shdr, ko->ko_shdrsz);
777 ko->ko_shdr = NULL;
778 }
779 }
780
781 /*
782 * kobj_sym_lookup:
783 *
784 * Symbol lookup function to be used when the symbol index
785 * is known (ie during relocation).
786 */
787 uintptr_t
788 kobj_sym_lookup(kobj_t ko, uintptr_t symidx)
789 {
790 const Elf_Sym *sym;
791 const char *symbol;
792
793 /* Don't even try to lookup the symbol if the index is bogus. */
794 if (symidx >= ko->ko_symcnt)
795 return 0;
796
797 sym = ko->ko_symtab + symidx;
798
799 /* Quick answer if there is a definition included. */
800 if (sym->st_shndx != SHN_UNDEF) {
801 return (uintptr_t)sym->st_value;
802 }
803
804 /* If we get here, then it is undefined and needs a lookup. */
805 switch (ELF_ST_BIND(sym->st_info)) {
806 case STB_LOCAL:
807 /* Local, but undefined? huh? */
808 kobj_error("local symbol undefined");
809 return 0;
810
811 case STB_GLOBAL:
812 /* Relative to Data or Function name */
813 symbol = ko->ko_strtab + sym->st_name;
814
815 /* Force a lookup failure if the symbol name is bogus. */
816 if (*symbol == 0) {
817 kobj_error("bad symbol name");
818 return 0;
819 }
820
821 return (uintptr_t)sym->st_value;
822
823 case STB_WEAK:
824 kobj_error("weak symbols not supported\n");
825 return 0;
826
827 default:
828 return 0;
829 }
830 }
831
832 /*
833 * kobj_findbase:
834 *
835 * Return base address of the given section.
836 */
837 static uintptr_t
838 kobj_findbase(kobj_t ko, int sec)
839 {
840 int i;
841
842 for (i = 0; i < ko->ko_nprogtab; i++) {
843 if (sec == ko->ko_progtab[i].sec) {
844 return (uintptr_t)ko->ko_progtab[i].addr;
845 }
846 }
847 return 0;
848 }
849
850 /*
851 * kobj_checksyms:
852 *
853 * Scan symbol table for duplicates or resolve references to
854 * exernal symbols.
855 */
856 static int
857 kobj_checksyms(kobj_t ko, bool undefined)
858 {
859 unsigned long rval;
860 Elf_Sym *sym, *ms;
861 const char *name;
862 int error;
863
864 error = 0;
865
866 for (ms = (sym = ko->ko_symtab) + ko->ko_symcnt; sym < ms; sym++) {
867 /* Check validity of the symbol. */
868 if (ELF_ST_BIND(sym->st_info) != STB_GLOBAL ||
869 sym->st_name == 0)
870 continue;
871 if (undefined != (sym->st_shndx == SHN_UNDEF)) {
872 continue;
873 }
874
875 /*
876 * Look it up. Don't need to lock, as it is known that
877 * the symbol tables aren't going to change (we hold
878 * module_lock).
879 */
880 name = ko->ko_strtab + sym->st_name;
881 if (ksyms_getval_unlocked(NULL, name, &rval,
882 KSYMS_EXTERN) != 0) {
883 if (undefined) {
884 kobj_error("symbol `%s' not found", name);
885 error = ENOEXEC;
886 }
887 continue;
888 }
889
890 /* Save values of undefined globals. */
891 if (undefined) {
892 sym->st_value = (Elf_Addr)rval;
893 continue;
894 }
895
896 /* Check (and complain) about differing values. */
897 if (sym->st_value == rval) {
898 continue;
899 }
900 if (strcmp(name, "_bss_start") == 0 ||
901 strcmp(name, "__bss_start") == 0 ||
902 strcmp(name, "_bss_end__") == 0 ||
903 strcmp(name, "__bss_end__") == 0 ||
904 strcmp(name, "_edata") == 0 ||
905 strcmp(name, "_end") == 0 ||
906 strcmp(name, "__end") == 0 ||
907 strcmp(name, "__end__") == 0 ||
908 strncmp(name, "__start_link_set_", 17) == 0 ||
909 strncmp(name, "__stop_link_set_", 16)) {
910 continue;
911 }
912 kobj_error("global symbol `%s' redefined\n", name);
913 error = ENOEXEC;
914 }
915
916 return error;
917 }
918
919 /*
920 * kobj_relocate:
921 *
922 * Resolve relocations for the loaded object.
923 */
924 static int
925 kobj_relocate(kobj_t ko, bool local)
926 {
927 const Elf_Rel *rellim;
928 const Elf_Rel *rel;
929 const Elf_Rela *relalim;
930 const Elf_Rela *rela;
931 const Elf_Sym *sym;
932 uintptr_t base;
933 int i, error;
934 uintptr_t symidx;
935
936 /*
937 * Perform relocations without addend if there are any.
938 */
939 for (i = 0; i < ko->ko_nrel; i++) {
940 rel = ko->ko_reltab[i].rel;
941 if (rel == NULL) {
942 continue;
943 }
944 rellim = rel + ko->ko_reltab[i].nrel;
945 base = kobj_findbase(ko, ko->ko_reltab[i].sec);
946 if (base == 0) {
947 panic("lost base for e_reltab");
948 }
949 for (; rel < rellim; rel++) {
950 symidx = ELF_R_SYM(rel->r_info);
951 if (symidx >= ko->ko_symcnt) {
952 continue;
953 }
954 sym = ko->ko_symtab + symidx;
955 if (local != (ELF_ST_BIND(sym->st_info) == STB_LOCAL)) {
956 continue;
957 }
958 error = kobj_reloc(ko, base, rel, false, local);
959 if (error != 0) {
960 return ENOENT;
961 }
962 }
963 }
964
965 /*
966 * Perform relocations with addend if there are any.
967 */
968 for (i = 0; i < ko->ko_nrela; i++) {
969 rela = ko->ko_relatab[i].rela;
970 if (rela == NULL) {
971 continue;
972 }
973 relalim = rela + ko->ko_relatab[i].nrela;
974 base = kobj_findbase(ko, ko->ko_relatab[i].sec);
975 if (base == 0) {
976 panic("lost base for e_relatab");
977 }
978 for (; rela < relalim; rela++) {
979 symidx = ELF_R_SYM(rela->r_info);
980 if (symidx >= ko->ko_symcnt) {
981 continue;
982 }
983 sym = ko->ko_symtab + symidx;
984 if (local != (ELF_ST_BIND(sym->st_info) == STB_LOCAL)) {
985 continue;
986 }
987 error = kobj_reloc(ko, base, rela, true, local);
988 if (error != 0) {
989 return ENOENT;
990 }
991 }
992 }
993
994 return 0;
995 }
996
997 /*
998 * kobj_error:
999 *
1000 * Utility function: log an error.
1001 */
1002 static void
1003 kobj_error(const char *fmt, ...)
1004 {
1005 va_list ap;
1006
1007 va_start(ap, fmt);
1008 printf("WARNING: linker error: ");
1009 vprintf(fmt, ap);
1010 printf("\n");
1011 va_end(ap);
1012 }
1013
1014 /*
1015 * kobj_read:
1016 *
1017 * Utility function: read from the object.
1018 */
1019 static int
1020 kobj_read(kobj_t ko, void **basep, size_t size, off_t off)
1021 {
1022 size_t resid;
1023 void *base;
1024 int error;
1025
1026 KASSERT(ko->ko_source != NULL);
1027
1028 switch (ko->ko_type) {
1029 case KT_VNODE:
1030 base = kmem_alloc(size, KM_SLEEP);
1031 if (base == NULL) {
1032 error = ENOMEM;
1033 break;
1034 }
1035 error = vn_rdwr(UIO_READ, ko->ko_source, base, size, off,
1036 UIO_SYSSPACE, IO_NODELOCKED, curlwp->l_cred, &resid,
1037 curlwp);
1038 if (error == 0 && resid != 0) {
1039 error = EINVAL;
1040 }
1041 if (error != 0) {
1042 kmem_free(base, size);
1043 base = NULL;
1044 }
1045 break;
1046 case KT_MEMORY:
1047 if (ko->ko_memsize != -1 && off + size > ko->ko_memsize) {
1048 kobj_error("kobj_read: preloaded object short");
1049 error = EINVAL;
1050 base = NULL;
1051 } else {
1052 base = (uint8_t *)ko->ko_source + off;
1053 error = 0;
1054 }
1055 break;
1056 default:
1057 panic("kobj_read: invalid type");
1058 }
1059
1060 *basep = base;
1061 return error;
1062 }
1063
1064 /*
1065 * kobj_read_bits:
1066 *
1067 * Utility function: load a section from the object.
1068 */
1069 static int
1070 kobj_read_bits(kobj_t ko, void *base, size_t size, off_t off)
1071 {
1072 size_t resid;
1073 int error;
1074
1075 KASSERT(ko->ko_source != NULL);
1076
1077 switch (ko->ko_type) {
1078 case KT_VNODE:
1079 KASSERT((uintptr_t)base >= (uintptr_t)ko->ko_address);
1080 KASSERT((uintptr_t)base + size <=
1081 (uintptr_t)ko->ko_address + ko->ko_size);
1082 error = vn_rdwr(UIO_READ, ko->ko_source, base, size, off,
1083 UIO_SYSSPACE, IO_NODELOCKED, curlwp->l_cred, &resid,
1084 curlwp);
1085 if (error == 0 && resid != 0) {
1086 error = EINVAL;
1087 }
1088 break;
1089 case KT_MEMORY:
1090 if (ko->ko_memsize != -1 && off + size > ko->ko_memsize) {
1091 kobj_error("kobj_read_bits: preloaded object short");
1092 error = EINVAL;
1093 } else if ((uint8_t *)base != (uint8_t *)ko->ko_source + off) {
1094 kobj_error("kobj_read_bits: object not aligned");
1095 kobj_error("source=%p base=%p off=%d size=%zd",
1096 ko->ko_source, base, (int)off, size);
1097 error = EINVAL;
1098 } else {
1099 /* Nothing to do. Loading in-situ. */
1100 error = 0;
1101 }
1102 break;
1103 default:
1104 panic("kobj_read: invalid type");
1105 }
1106
1107 return error;
1108 }
1109
1110 /*
1111 * kobj_free:
1112 *
1113 * Utility function: free memory if it was allocated from the heap.
1114 */
1115 static void
1116 kobj_free(kobj_t ko, void *base, size_t size)
1117 {
1118
1119 if (ko->ko_type != KT_MEMORY)
1120 kmem_free(base, size);
1121 }
1122
1123 #else /* MODULAR */
1124
1125 int
1126 kobj_load_file(kobj_t *kop, const char *name, const char *base, bool autoload)
1127 {
1128
1129 return ENOSYS;
1130 }
1131
1132 int
1133 kobj_load_mem(kobj_t *kop, void *base, ssize_t size)
1134 {
1135
1136 return ENOSYS;
1137 }
1138
1139 void
1140 kobj_unload(kobj_t ko)
1141 {
1142
1143 panic("not modular");
1144 }
1145
1146 void
1147 kobj_stat(kobj_t ko, vaddr_t *base, size_t *size)
1148 {
1149
1150 panic("not modular");
1151 }
1152
1153 int
1154 kobj_affix(kobj_t ko, const char *name)
1155 {
1156
1157 panic("not modular");
1158 }
1159
1160 int
1161 kobj_find_section(kobj_t ko, const char *name, void **addr, size_t *size)
1162 {
1163
1164 panic("not modular");
1165 }
1166
1167 #endif /* MODULAR */
1168