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