1 /* $NetBSD: subr_kobj.c,v 1.46 2013/08/09 05:10:14 matt 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.46 2013/08/09 05:10:14 matt 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