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