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