1 // SPDX-License-Identifier: GPL-2.0 2 /* This is included from relocs_32/64.c */ 3 4 #define ElfW(type) _ElfW(ELF_BITS, type) 5 #define _ElfW(bits, type) __ElfW(bits, type) 6 #define __ElfW(bits, type) Elf##bits##_##type 7 8 #define Elf_Addr ElfW(Addr) 9 #define Elf_Ehdr ElfW(Ehdr) 10 #define Elf_Phdr ElfW(Phdr) 11 #define Elf_Shdr ElfW(Shdr) 12 #define Elf_Sym ElfW(Sym) 13 14 static Elf_Ehdr ehdr; 15 static unsigned long shnum; 16 static unsigned int shstrndx; 17 static unsigned int shsymtabndx; 18 static unsigned int shxsymtabndx; 19 20 static int sym_index(Elf_Sym *sym); 21 22 struct relocs { 23 uint32_t *offset; 24 unsigned long count; 25 unsigned long size; 26 }; 27 28 static struct relocs relocs16; 29 static struct relocs relocs32; 30 #if ELF_BITS == 64 31 static struct relocs relocs32neg; 32 static struct relocs relocs64; 33 #define FMT PRIu64 34 #else 35 #define FMT PRIu32 36 #endif 37 38 struct section { 39 Elf_Shdr shdr; 40 struct section *link; 41 Elf_Sym *symtab; 42 Elf32_Word *xsymtab; 43 Elf_Rel *reltab; 44 char *strtab; 45 }; 46 static struct section *secs; 47 48 static const char * const sym_regex_kernel[S_NSYMTYPES] = { 49 /* 50 * Following symbols have been audited. There values are constant and do 51 * not change if bzImage is loaded at a different physical address than 52 * the address for which it has been compiled. Don't warn user about 53 * absolute relocations present w.r.t these symbols. 54 */ 55 [S_ABS] = 56 "^(xen_irq_disable_direct_reloc$|" 57 "xen_save_fl_direct_reloc$|" 58 "VDSO|" 59 "__kcfi_typeid_|" 60 "__crc_)", 61 62 /* 63 * These symbols are known to be relative, even if the linker marks them 64 * as absolute (typically defined outside any section in the linker script.) 65 */ 66 [S_REL] = 67 "^(__init_(begin|end)|" 68 "__x86_cpu_dev_(start|end)|" 69 "(__parainstructions|__alt_instructions)(_end)?|" 70 "(__iommu_table|__apicdrivers|__smp_locks)(_end)?|" 71 "__(start|end)_pci_.*|" 72 #if CONFIG_FW_LOADER 73 "__(start|end)_builtin_fw|" 74 #endif 75 "__(start|stop)___ksymtab(_gpl)?|" 76 "__(start|stop)___kcrctab(_gpl)?|" 77 "__(start|stop)___param|" 78 "__(start|stop)___modver|" 79 "__(start|stop)___bug_table|" 80 "__tracedata_(start|end)|" 81 "__(start|stop)_notes|" 82 "__end_rodata|" 83 "__end_rodata_aligned|" 84 "__initramfs_start|" 85 "(jiffies|jiffies_64)|" 86 #if ELF_BITS == 64 87 "__per_cpu_load|" 88 "init_per_cpu__.*|" 89 "__end_rodata_hpage_align|" 90 #endif 91 "__vvar_page|" 92 "_end)$" 93 }; 94 95 96 static const char * const sym_regex_realmode[S_NSYMTYPES] = { 97 /* 98 * These symbols are known to be relative, even if the linker marks them 99 * as absolute (typically defined outside any section in the linker script.) 100 */ 101 [S_REL] = 102 "^pa_", 103 104 /* 105 * These are 16-bit segment symbols when compiling 16-bit code. 106 */ 107 [S_SEG] = 108 "^real_mode_seg$", 109 110 /* 111 * These are offsets belonging to segments, as opposed to linear addresses, 112 * when compiling 16-bit code. 113 */ 114 [S_LIN] = 115 "^pa_", 116 }; 117 118 static const char * const *sym_regex; 119 120 static regex_t sym_regex_c[S_NSYMTYPES]; 121 static int is_reloc(enum symtype type, const char *sym_name) 122 { 123 return sym_regex[type] && 124 !regexec(&sym_regex_c[type], sym_name, 0, NULL, 0); 125 } 126 127 static void regex_init(int use_real_mode) 128 { 129 char errbuf[128]; 130 int err; 131 int i; 132 133 if (use_real_mode) 134 sym_regex = sym_regex_realmode; 135 else 136 sym_regex = sym_regex_kernel; 137 138 for (i = 0; i < S_NSYMTYPES; i++) { 139 if (!sym_regex[i]) 140 continue; 141 142 err = regcomp(&sym_regex_c[i], sym_regex[i], 143 REG_EXTENDED|REG_NOSUB); 144 145 if (err) { 146 regerror(err, &sym_regex_c[i], errbuf, sizeof(errbuf)); 147 die("%s", errbuf); 148 } 149 } 150 } 151 152 static const char *sym_type(unsigned type) 153 { 154 static const char *type_name[] = { 155 #define SYM_TYPE(X) [X] = #X 156 SYM_TYPE(STT_NOTYPE), 157 SYM_TYPE(STT_OBJECT), 158 SYM_TYPE(STT_FUNC), 159 SYM_TYPE(STT_SECTION), 160 SYM_TYPE(STT_FILE), 161 SYM_TYPE(STT_COMMON), 162 SYM_TYPE(STT_TLS), 163 #undef SYM_TYPE 164 }; 165 const char *name = "unknown sym type name"; 166 if (type < ARRAY_SIZE(type_name)) { 167 name = type_name[type]; 168 } 169 return name; 170 } 171 172 static const char *sym_bind(unsigned bind) 173 { 174 static const char *bind_name[] = { 175 #define SYM_BIND(X) [X] = #X 176 SYM_BIND(STB_LOCAL), 177 SYM_BIND(STB_GLOBAL), 178 SYM_BIND(STB_WEAK), 179 #undef SYM_BIND 180 }; 181 const char *name = "unknown sym bind name"; 182 if (bind < ARRAY_SIZE(bind_name)) { 183 name = bind_name[bind]; 184 } 185 return name; 186 } 187 188 static const char *sym_visibility(unsigned visibility) 189 { 190 static const char *visibility_name[] = { 191 #define SYM_VISIBILITY(X) [X] = #X 192 SYM_VISIBILITY(STV_DEFAULT), 193 SYM_VISIBILITY(STV_INTERNAL), 194 SYM_VISIBILITY(STV_HIDDEN), 195 SYM_VISIBILITY(STV_PROTECTED), 196 #undef SYM_VISIBILITY 197 }; 198 const char *name = "unknown sym visibility name"; 199 if (visibility < ARRAY_SIZE(visibility_name)) { 200 name = visibility_name[visibility]; 201 } 202 return name; 203 } 204 205 static const char *rel_type(unsigned type) 206 { 207 static const char *type_name[] = { 208 #define REL_TYPE(X) [X] = #X 209 #if ELF_BITS == 64 210 REL_TYPE(R_X86_64_NONE), 211 REL_TYPE(R_X86_64_64), 212 REL_TYPE(R_X86_64_PC64), 213 REL_TYPE(R_X86_64_PC32), 214 REL_TYPE(R_X86_64_GOT32), 215 REL_TYPE(R_X86_64_PLT32), 216 REL_TYPE(R_X86_64_COPY), 217 REL_TYPE(R_X86_64_GLOB_DAT), 218 REL_TYPE(R_X86_64_JUMP_SLOT), 219 REL_TYPE(R_X86_64_RELATIVE), 220 REL_TYPE(R_X86_64_GOTPCREL), 221 REL_TYPE(R_X86_64_32), 222 REL_TYPE(R_X86_64_32S), 223 REL_TYPE(R_X86_64_16), 224 REL_TYPE(R_X86_64_PC16), 225 REL_TYPE(R_X86_64_8), 226 REL_TYPE(R_X86_64_PC8), 227 #else 228 REL_TYPE(R_386_NONE), 229 REL_TYPE(R_386_32), 230 REL_TYPE(R_386_PC32), 231 REL_TYPE(R_386_GOT32), 232 REL_TYPE(R_386_PLT32), 233 REL_TYPE(R_386_COPY), 234 REL_TYPE(R_386_GLOB_DAT), 235 REL_TYPE(R_386_JMP_SLOT), 236 REL_TYPE(R_386_RELATIVE), 237 REL_TYPE(R_386_GOTOFF), 238 REL_TYPE(R_386_GOTPC), 239 REL_TYPE(R_386_8), 240 REL_TYPE(R_386_PC8), 241 REL_TYPE(R_386_16), 242 REL_TYPE(R_386_PC16), 243 #endif 244 #undef REL_TYPE 245 }; 246 const char *name = "unknown type rel type name"; 247 if (type < ARRAY_SIZE(type_name) && type_name[type]) { 248 name = type_name[type]; 249 } 250 return name; 251 } 252 253 static const char *sec_name(unsigned shndx) 254 { 255 const char *sec_strtab; 256 const char *name; 257 sec_strtab = secs[shstrndx].strtab; 258 name = "<noname>"; 259 if (shndx < shnum) { 260 name = sec_strtab + secs[shndx].shdr.sh_name; 261 } 262 else if (shndx == SHN_ABS) { 263 name = "ABSOLUTE"; 264 } 265 else if (shndx == SHN_COMMON) { 266 name = "COMMON"; 267 } 268 return name; 269 } 270 271 static const char *sym_name(const char *sym_strtab, Elf_Sym *sym) 272 { 273 const char *name; 274 name = "<noname>"; 275 if (sym->st_name) { 276 name = sym_strtab + sym->st_name; 277 } 278 else { 279 name = sec_name(sym_index(sym)); 280 } 281 return name; 282 } 283 284 static Elf_Sym *sym_lookup(const char *symname) 285 { 286 int i; 287 for (i = 0; i < shnum; i++) { 288 struct section *sec = &secs[i]; 289 long nsyms; 290 char *strtab; 291 Elf_Sym *symtab; 292 Elf_Sym *sym; 293 294 if (sec->shdr.sh_type != SHT_SYMTAB) 295 continue; 296 297 nsyms = sec->shdr.sh_size/sizeof(Elf_Sym); 298 symtab = sec->symtab; 299 strtab = sec->link->strtab; 300 301 for (sym = symtab; --nsyms >= 0; sym++) { 302 if (!sym->st_name) 303 continue; 304 if (strcmp(symname, strtab + sym->st_name) == 0) 305 return sym; 306 } 307 } 308 return 0; 309 } 310 311 #if BYTE_ORDER == LITTLE_ENDIAN 312 #define le16_to_cpu(val) (val) 313 #define le32_to_cpu(val) (val) 314 #define le64_to_cpu(val) (val) 315 #endif 316 #if BYTE_ORDER == BIG_ENDIAN 317 #define le16_to_cpu(val) bswap_16(val) 318 #define le32_to_cpu(val) bswap_32(val) 319 #define le64_to_cpu(val) bswap_64(val) 320 #endif 321 322 static uint16_t elf16_to_cpu(uint16_t val) 323 { 324 return le16_to_cpu(val); 325 } 326 327 static uint32_t elf32_to_cpu(uint32_t val) 328 { 329 return le32_to_cpu(val); 330 } 331 332 #define elf_half_to_cpu(x) elf16_to_cpu(x) 333 #define elf_word_to_cpu(x) elf32_to_cpu(x) 334 335 #if ELF_BITS == 64 336 static uint64_t elf64_to_cpu(uint64_t val) 337 { 338 return le64_to_cpu(val); 339 } 340 #define elf_addr_to_cpu(x) elf64_to_cpu(x) 341 #define elf_off_to_cpu(x) elf64_to_cpu(x) 342 #define elf_xword_to_cpu(x) elf64_to_cpu(x) 343 #else 344 #define elf_addr_to_cpu(x) elf32_to_cpu(x) 345 #define elf_off_to_cpu(x) elf32_to_cpu(x) 346 #define elf_xword_to_cpu(x) elf32_to_cpu(x) 347 #endif 348 349 static int sym_index(Elf_Sym *sym) 350 { 351 Elf_Sym *symtab = secs[shsymtabndx].symtab; 352 Elf32_Word *xsymtab = secs[shxsymtabndx].xsymtab; 353 unsigned long offset; 354 int index; 355 356 if (sym->st_shndx != SHN_XINDEX) 357 return sym->st_shndx; 358 359 /* calculate offset of sym from head of table. */ 360 offset = (unsigned long)sym - (unsigned long)symtab; 361 index = offset / sizeof(*sym); 362 363 return elf32_to_cpu(xsymtab[index]); 364 } 365 366 static void read_ehdr(FILE *fp) 367 { 368 if (fread(&ehdr, sizeof(ehdr), 1, fp) != 1) { 369 die("Cannot read ELF header: %s\n", 370 strerror(errno)); 371 } 372 if (memcmp(ehdr.e_ident, ELFMAG, SELFMAG) != 0) { 373 die("No ELF magic\n"); 374 } 375 if (ehdr.e_ident[EI_CLASS] != ELF_CLASS) { 376 die("Not a %d bit executable\n", ELF_BITS); 377 } 378 if (ehdr.e_ident[EI_DATA] != ELFDATA2LSB) { 379 die("Not a LSB ELF executable\n"); 380 } 381 if (ehdr.e_ident[EI_VERSION] != EV_CURRENT) { 382 die("Unknown ELF version\n"); 383 } 384 /* Convert the fields to native endian */ 385 ehdr.e_type = elf_half_to_cpu(ehdr.e_type); 386 ehdr.e_machine = elf_half_to_cpu(ehdr.e_machine); 387 ehdr.e_version = elf_word_to_cpu(ehdr.e_version); 388 ehdr.e_entry = elf_addr_to_cpu(ehdr.e_entry); 389 ehdr.e_phoff = elf_off_to_cpu(ehdr.e_phoff); 390 ehdr.e_shoff = elf_off_to_cpu(ehdr.e_shoff); 391 ehdr.e_flags = elf_word_to_cpu(ehdr.e_flags); 392 ehdr.e_ehsize = elf_half_to_cpu(ehdr.e_ehsize); 393 ehdr.e_phentsize = elf_half_to_cpu(ehdr.e_phentsize); 394 ehdr.e_phnum = elf_half_to_cpu(ehdr.e_phnum); 395 ehdr.e_shentsize = elf_half_to_cpu(ehdr.e_shentsize); 396 ehdr.e_shnum = elf_half_to_cpu(ehdr.e_shnum); 397 ehdr.e_shstrndx = elf_half_to_cpu(ehdr.e_shstrndx); 398 399 shnum = ehdr.e_shnum; 400 shstrndx = ehdr.e_shstrndx; 401 402 if ((ehdr.e_type != ET_EXEC) && (ehdr.e_type != ET_DYN)) 403 die("Unsupported ELF header type\n"); 404 if (ehdr.e_machine != ELF_MACHINE) 405 die("Not for %s\n", ELF_MACHINE_NAME); 406 if (ehdr.e_version != EV_CURRENT) 407 die("Unknown ELF version\n"); 408 if (ehdr.e_ehsize != sizeof(Elf_Ehdr)) 409 die("Bad ELF header size\n"); 410 if (ehdr.e_phentsize != sizeof(Elf_Phdr)) 411 die("Bad program header entry\n"); 412 if (ehdr.e_shentsize != sizeof(Elf_Shdr)) 413 die("Bad section header entry\n"); 414 415 416 if (shnum == SHN_UNDEF || shstrndx == SHN_XINDEX) { 417 Elf_Shdr shdr; 418 419 if (fseek(fp, ehdr.e_shoff, SEEK_SET) < 0) 420 die("Seek to %" FMT " failed: %s\n", ehdr.e_shoff, strerror(errno)); 421 422 if (fread(&shdr, sizeof(shdr), 1, fp) != 1) 423 die("Cannot read initial ELF section header: %s\n", strerror(errno)); 424 425 if (shnum == SHN_UNDEF) 426 shnum = elf_xword_to_cpu(shdr.sh_size); 427 428 if (shstrndx == SHN_XINDEX) 429 shstrndx = elf_word_to_cpu(shdr.sh_link); 430 } 431 432 if (shstrndx >= shnum) 433 die("String table index out of bounds\n"); 434 } 435 436 static void read_shdrs(FILE *fp) 437 { 438 int i; 439 Elf_Shdr shdr; 440 441 secs = calloc(shnum, sizeof(struct section)); 442 if (!secs) { 443 die("Unable to allocate %ld section headers\n", 444 shnum); 445 } 446 if (fseek(fp, ehdr.e_shoff, SEEK_SET) < 0) { 447 die("Seek to %" FMT " failed: %s\n", 448 ehdr.e_shoff, strerror(errno)); 449 } 450 for (i = 0; i < shnum; i++) { 451 struct section *sec = &secs[i]; 452 if (fread(&shdr, sizeof(shdr), 1, fp) != 1) 453 die("Cannot read ELF section headers %d/%ld: %s\n", 454 i, shnum, strerror(errno)); 455 sec->shdr.sh_name = elf_word_to_cpu(shdr.sh_name); 456 sec->shdr.sh_type = elf_word_to_cpu(shdr.sh_type); 457 sec->shdr.sh_flags = elf_xword_to_cpu(shdr.sh_flags); 458 sec->shdr.sh_addr = elf_addr_to_cpu(shdr.sh_addr); 459 sec->shdr.sh_offset = elf_off_to_cpu(shdr.sh_offset); 460 sec->shdr.sh_size = elf_xword_to_cpu(shdr.sh_size); 461 sec->shdr.sh_link = elf_word_to_cpu(shdr.sh_link); 462 sec->shdr.sh_info = elf_word_to_cpu(shdr.sh_info); 463 sec->shdr.sh_addralign = elf_xword_to_cpu(shdr.sh_addralign); 464 sec->shdr.sh_entsize = elf_xword_to_cpu(shdr.sh_entsize); 465 if (sec->shdr.sh_link < shnum) 466 sec->link = &secs[sec->shdr.sh_link]; 467 } 468 469 } 470 471 static void read_strtabs(FILE *fp) 472 { 473 int i; 474 for (i = 0; i < shnum; i++) { 475 struct section *sec = &secs[i]; 476 if (sec->shdr.sh_type != SHT_STRTAB) { 477 continue; 478 } 479 sec->strtab = malloc(sec->shdr.sh_size); 480 if (!sec->strtab) { 481 die("malloc of %" FMT " bytes for strtab failed\n", 482 sec->shdr.sh_size); 483 } 484 if (fseek(fp, sec->shdr.sh_offset, SEEK_SET) < 0) { 485 die("Seek to %" FMT " failed: %s\n", 486 sec->shdr.sh_offset, strerror(errno)); 487 } 488 if (fread(sec->strtab, 1, sec->shdr.sh_size, fp) 489 != sec->shdr.sh_size) { 490 die("Cannot read symbol table: %s\n", 491 strerror(errno)); 492 } 493 } 494 } 495 496 static void read_symtabs(FILE *fp) 497 { 498 int i,j; 499 500 for (i = 0; i < shnum; i++) { 501 struct section *sec = &secs[i]; 502 int num_syms; 503 504 switch (sec->shdr.sh_type) { 505 case SHT_SYMTAB_SHNDX: 506 sec->xsymtab = malloc(sec->shdr.sh_size); 507 if (!sec->xsymtab) { 508 die("malloc of %" FMT " bytes for xsymtab failed\n", 509 sec->shdr.sh_size); 510 } 511 if (fseek(fp, sec->shdr.sh_offset, SEEK_SET) < 0) { 512 die("Seek to %" FMT " failed: %s\n", 513 sec->shdr.sh_offset, strerror(errno)); 514 } 515 if (fread(sec->xsymtab, 1, sec->shdr.sh_size, fp) 516 != sec->shdr.sh_size) { 517 die("Cannot read extended symbol table: %s\n", 518 strerror(errno)); 519 } 520 shxsymtabndx = i; 521 continue; 522 523 case SHT_SYMTAB: 524 num_syms = sec->shdr.sh_size / sizeof(Elf_Sym); 525 526 sec->symtab = malloc(sec->shdr.sh_size); 527 if (!sec->symtab) { 528 die("malloc of %" FMT " bytes for symtab failed\n", 529 sec->shdr.sh_size); 530 } 531 if (fseek(fp, sec->shdr.sh_offset, SEEK_SET) < 0) { 532 die("Seek to %" FMT " failed: %s\n", 533 sec->shdr.sh_offset, strerror(errno)); 534 } 535 if (fread(sec->symtab, 1, sec->shdr.sh_size, fp) 536 != sec->shdr.sh_size) { 537 die("Cannot read symbol table: %s\n", 538 strerror(errno)); 539 } 540 for (j = 0; j < num_syms; j++) { 541 Elf_Sym *sym = &sec->symtab[j]; 542 543 sym->st_name = elf_word_to_cpu(sym->st_name); 544 sym->st_value = elf_addr_to_cpu(sym->st_value); 545 sym->st_size = elf_xword_to_cpu(sym->st_size); 546 sym->st_shndx = elf_half_to_cpu(sym->st_shndx); 547 } 548 shsymtabndx = i; 549 continue; 550 551 default: 552 continue; 553 } 554 } 555 } 556 557 558 static void read_relocs(FILE *fp) 559 { 560 int i,j; 561 for (i = 0; i < shnum; i++) { 562 struct section *sec = &secs[i]; 563 if (sec->shdr.sh_type != SHT_REL_TYPE) { 564 continue; 565 } 566 sec->reltab = malloc(sec->shdr.sh_size); 567 if (!sec->reltab) { 568 die("malloc of %" FMT " bytes for relocs failed\n", 569 sec->shdr.sh_size); 570 } 571 if (fseek(fp, sec->shdr.sh_offset, SEEK_SET) < 0) { 572 die("Seek to %" FMT " failed: %s\n", 573 sec->shdr.sh_offset, strerror(errno)); 574 } 575 if (fread(sec->reltab, 1, sec->shdr.sh_size, fp) 576 != sec->shdr.sh_size) { 577 die("Cannot read symbol table: %s\n", 578 strerror(errno)); 579 } 580 for (j = 0; j < sec->shdr.sh_size/sizeof(Elf_Rel); j++) { 581 Elf_Rel *rel = &sec->reltab[j]; 582 rel->r_offset = elf_addr_to_cpu(rel->r_offset); 583 rel->r_info = elf_xword_to_cpu(rel->r_info); 584 #if (SHT_REL_TYPE == SHT_RELA) 585 rel->r_addend = elf_xword_to_cpu(rel->r_addend); 586 #endif 587 } 588 } 589 } 590 591 592 static void print_absolute_symbols(void) 593 { 594 int i; 595 const char *format; 596 597 if (ELF_BITS == 64) 598 format = "%5d %016"PRIx64" %5"PRId64" %10s %10s %12s %s\n"; 599 else 600 format = "%5d %08"PRIx32" %5"PRId32" %10s %10s %12s %s\n"; 601 602 printf("Absolute symbols\n"); 603 printf(" Num: Value Size Type Bind Visibility Name\n"); 604 for (i = 0; i < shnum; i++) { 605 struct section *sec = &secs[i]; 606 char *sym_strtab; 607 int j; 608 609 if (sec->shdr.sh_type != SHT_SYMTAB) { 610 continue; 611 } 612 sym_strtab = sec->link->strtab; 613 for (j = 0; j < sec->shdr.sh_size/sizeof(Elf_Sym); j++) { 614 Elf_Sym *sym; 615 const char *name; 616 sym = &sec->symtab[j]; 617 name = sym_name(sym_strtab, sym); 618 if (sym->st_shndx != SHN_ABS) { 619 continue; 620 } 621 printf(format, 622 j, sym->st_value, sym->st_size, 623 sym_type(ELF_ST_TYPE(sym->st_info)), 624 sym_bind(ELF_ST_BIND(sym->st_info)), 625 sym_visibility(ELF_ST_VISIBILITY(sym->st_other)), 626 name); 627 } 628 } 629 printf("\n"); 630 } 631 632 static void print_absolute_relocs(void) 633 { 634 int i, printed = 0; 635 const char *format; 636 637 if (ELF_BITS == 64) 638 format = "%016"PRIx64" %016"PRIx64" %10s %016"PRIx64" %s\n"; 639 else 640 format = "%08"PRIx32" %08"PRIx32" %10s %08"PRIx32" %s\n"; 641 642 for (i = 0; i < shnum; i++) { 643 struct section *sec = &secs[i]; 644 struct section *sec_applies, *sec_symtab; 645 char *sym_strtab; 646 Elf_Sym *sh_symtab; 647 int j; 648 if (sec->shdr.sh_type != SHT_REL_TYPE) { 649 continue; 650 } 651 sec_symtab = sec->link; 652 sec_applies = &secs[sec->shdr.sh_info]; 653 if (!(sec_applies->shdr.sh_flags & SHF_ALLOC)) { 654 continue; 655 } 656 /* 657 * Do not perform relocations in .notes section; any 658 * values there are meant for pre-boot consumption (e.g. 659 * startup_xen). 660 */ 661 if (sec_applies->shdr.sh_type == SHT_NOTE) { 662 continue; 663 } 664 sh_symtab = sec_symtab->symtab; 665 sym_strtab = sec_symtab->link->strtab; 666 for (j = 0; j < sec->shdr.sh_size/sizeof(Elf_Rel); j++) { 667 Elf_Rel *rel; 668 Elf_Sym *sym; 669 const char *name; 670 rel = &sec->reltab[j]; 671 sym = &sh_symtab[ELF_R_SYM(rel->r_info)]; 672 name = sym_name(sym_strtab, sym); 673 if (sym->st_shndx != SHN_ABS) { 674 continue; 675 } 676 677 /* Absolute symbols are not relocated if bzImage is 678 * loaded at a non-compiled address. Display a warning 679 * to user at compile time about the absolute 680 * relocations present. 681 * 682 * User need to audit the code to make sure 683 * some symbols which should have been section 684 * relative have not become absolute because of some 685 * linker optimization or wrong programming usage. 686 * 687 * Before warning check if this absolute symbol 688 * relocation is harmless. 689 */ 690 if (is_reloc(S_ABS, name) || is_reloc(S_REL, name)) 691 continue; 692 693 if (!printed) { 694 printf("WARNING: Absolute relocations" 695 " present\n"); 696 printf("Offset Info Type Sym.Value " 697 "Sym.Name\n"); 698 printed = 1; 699 } 700 701 printf(format, 702 rel->r_offset, 703 rel->r_info, 704 rel_type(ELF_R_TYPE(rel->r_info)), 705 sym->st_value, 706 name); 707 } 708 } 709 710 if (printed) 711 printf("\n"); 712 } 713 714 static void add_reloc(struct relocs *r, uint32_t offset) 715 { 716 if (r->count == r->size) { 717 unsigned long newsize = r->size + 50000; 718 void *mem = realloc(r->offset, newsize * sizeof(r->offset[0])); 719 720 if (!mem) 721 die("realloc of %ld entries for relocs failed\n", 722 newsize); 723 r->offset = mem; 724 r->size = newsize; 725 } 726 r->offset[r->count++] = offset; 727 } 728 729 static void walk_relocs(int (*process)(struct section *sec, Elf_Rel *rel, 730 Elf_Sym *sym, const char *symname)) 731 { 732 int i; 733 /* Walk through the relocations */ 734 for (i = 0; i < shnum; i++) { 735 char *sym_strtab; 736 Elf_Sym *sh_symtab; 737 struct section *sec_applies, *sec_symtab; 738 int j; 739 struct section *sec = &secs[i]; 740 741 if (sec->shdr.sh_type != SHT_REL_TYPE) { 742 continue; 743 } 744 sec_symtab = sec->link; 745 sec_applies = &secs[sec->shdr.sh_info]; 746 if (!(sec_applies->shdr.sh_flags & SHF_ALLOC)) { 747 continue; 748 } 749 sh_symtab = sec_symtab->symtab; 750 sym_strtab = sec_symtab->link->strtab; 751 for (j = 0; j < sec->shdr.sh_size/sizeof(Elf_Rel); j++) { 752 Elf_Rel *rel = &sec->reltab[j]; 753 Elf_Sym *sym = &sh_symtab[ELF_R_SYM(rel->r_info)]; 754 const char *symname = sym_name(sym_strtab, sym); 755 756 process(sec, rel, sym, symname); 757 } 758 } 759 } 760 761 /* 762 * The .data..percpu section is a special case for x86_64 SMP kernels. 763 * It is used to initialize the actual per_cpu areas and to provide 764 * definitions for the per_cpu variables that correspond to their offsets 765 * within the percpu area. Since the values of all of the symbols need 766 * to be offsets from the start of the per_cpu area the virtual address 767 * (sh_addr) of .data..percpu is 0 in SMP kernels. 768 * 769 * This means that: 770 * 771 * Relocations that reference symbols in the per_cpu area do not 772 * need further relocation (since the value is an offset relative 773 * to the start of the per_cpu area that does not change). 774 * 775 * Relocations that apply to the per_cpu area need to have their 776 * offset adjusted by by the value of __per_cpu_load to make them 777 * point to the correct place in the loaded image (because the 778 * virtual address of .data..percpu is 0). 779 * 780 * For non SMP kernels .data..percpu is linked as part of the normal 781 * kernel data and does not require special treatment. 782 * 783 */ 784 static int per_cpu_shndx = -1; 785 static Elf_Addr per_cpu_load_addr; 786 787 static void percpu_init(void) 788 { 789 int i; 790 for (i = 0; i < shnum; i++) { 791 ElfW(Sym) *sym; 792 if (strcmp(sec_name(i), ".data..percpu")) 793 continue; 794 795 if (secs[i].shdr.sh_addr != 0) /* non SMP kernel */ 796 return; 797 798 sym = sym_lookup("__per_cpu_load"); 799 if (!sym) 800 die("can't find __per_cpu_load\n"); 801 802 per_cpu_shndx = i; 803 per_cpu_load_addr = sym->st_value; 804 return; 805 } 806 } 807 808 #if ELF_BITS == 64 809 810 /* 811 * Check to see if a symbol lies in the .data..percpu section. 812 * 813 * The linker incorrectly associates some symbols with the 814 * .data..percpu section so we also need to check the symbol 815 * name to make sure that we classify the symbol correctly. 816 * 817 * The GNU linker incorrectly associates: 818 * __init_begin 819 * __per_cpu_load 820 * 821 * The "gold" linker incorrectly associates: 822 * init_per_cpu__fixed_percpu_data 823 * init_per_cpu__gdt_page 824 */ 825 static int is_percpu_sym(ElfW(Sym) *sym, const char *symname) 826 { 827 int shndx = sym_index(sym); 828 829 return (shndx == per_cpu_shndx) && 830 strcmp(symname, "__init_begin") && 831 strcmp(symname, "__per_cpu_load") && 832 strncmp(symname, "init_per_cpu_", 13); 833 } 834 835 836 static int do_reloc64(struct section *sec, Elf_Rel *rel, ElfW(Sym) *sym, 837 const char *symname) 838 { 839 unsigned r_type = ELF64_R_TYPE(rel->r_info); 840 ElfW(Addr) offset = rel->r_offset; 841 int shn_abs = (sym->st_shndx == SHN_ABS) && !is_reloc(S_REL, symname); 842 843 if (sym->st_shndx == SHN_UNDEF) 844 return 0; 845 846 /* 847 * Adjust the offset if this reloc applies to the percpu section. 848 */ 849 if (sec->shdr.sh_info == per_cpu_shndx) 850 offset += per_cpu_load_addr; 851 852 switch (r_type) { 853 case R_X86_64_NONE: 854 /* NONE can be ignored. */ 855 break; 856 857 case R_X86_64_PC32: 858 case R_X86_64_PLT32: 859 /* 860 * PC relative relocations don't need to be adjusted unless 861 * referencing a percpu symbol. 862 * 863 * NB: R_X86_64_PLT32 can be treated as R_X86_64_PC32. 864 */ 865 if (is_percpu_sym(sym, symname)) 866 add_reloc(&relocs32neg, offset); 867 break; 868 869 case R_X86_64_PC64: 870 /* 871 * Only used by jump labels 872 */ 873 if (is_percpu_sym(sym, symname)) 874 die("Invalid R_X86_64_PC64 relocation against per-CPU symbol %s\n", 875 symname); 876 break; 877 878 case R_X86_64_32: 879 case R_X86_64_32S: 880 case R_X86_64_64: 881 /* 882 * References to the percpu area don't need to be adjusted. 883 */ 884 if (is_percpu_sym(sym, symname)) 885 break; 886 887 if (shn_abs) { 888 /* 889 * Whitelisted absolute symbols do not require 890 * relocation. 891 */ 892 if (is_reloc(S_ABS, symname)) 893 break; 894 895 die("Invalid absolute %s relocation: %s\n", 896 rel_type(r_type), symname); 897 break; 898 } 899 900 /* 901 * Relocation offsets for 64 bit kernels are output 902 * as 32 bits and sign extended back to 64 bits when 903 * the relocations are processed. 904 * Make sure that the offset will fit. 905 */ 906 if ((int32_t)offset != (int64_t)offset) 907 die("Relocation offset doesn't fit in 32 bits\n"); 908 909 if (r_type == R_X86_64_64) 910 add_reloc(&relocs64, offset); 911 else 912 add_reloc(&relocs32, offset); 913 break; 914 915 default: 916 die("Unsupported relocation type: %s (%d)\n", 917 rel_type(r_type), r_type); 918 break; 919 } 920 921 return 0; 922 } 923 924 #else 925 926 static int do_reloc32(struct section *sec, Elf_Rel *rel, Elf_Sym *sym, 927 const char *symname) 928 { 929 unsigned r_type = ELF32_R_TYPE(rel->r_info); 930 int shn_abs = (sym->st_shndx == SHN_ABS) && !is_reloc(S_REL, symname); 931 932 switch (r_type) { 933 case R_386_NONE: 934 case R_386_PC32: 935 case R_386_PC16: 936 case R_386_PC8: 937 case R_386_PLT32: 938 /* 939 * NONE can be ignored and PC relative relocations don't need 940 * to be adjusted. Because sym must be defined, R_386_PLT32 can 941 * be treated the same way as R_386_PC32. 942 */ 943 break; 944 945 case R_386_32: 946 if (shn_abs) { 947 /* 948 * Whitelisted absolute symbols do not require 949 * relocation. 950 */ 951 if (is_reloc(S_ABS, symname)) 952 break; 953 954 die("Invalid absolute %s relocation: %s\n", 955 rel_type(r_type), symname); 956 break; 957 } 958 959 add_reloc(&relocs32, rel->r_offset); 960 break; 961 962 default: 963 die("Unsupported relocation type: %s (%d)\n", 964 rel_type(r_type), r_type); 965 break; 966 } 967 968 return 0; 969 } 970 971 static int do_reloc_real(struct section *sec, Elf_Rel *rel, Elf_Sym *sym, 972 const char *symname) 973 { 974 unsigned r_type = ELF32_R_TYPE(rel->r_info); 975 int shn_abs = (sym->st_shndx == SHN_ABS) && !is_reloc(S_REL, symname); 976 977 switch (r_type) { 978 case R_386_NONE: 979 case R_386_PC32: 980 case R_386_PC16: 981 case R_386_PC8: 982 case R_386_PLT32: 983 /* 984 * NONE can be ignored and PC relative relocations don't need 985 * to be adjusted. Because sym must be defined, R_386_PLT32 can 986 * be treated the same way as R_386_PC32. 987 */ 988 break; 989 990 case R_386_16: 991 if (shn_abs) { 992 /* 993 * Whitelisted absolute symbols do not require 994 * relocation. 995 */ 996 if (is_reloc(S_ABS, symname)) 997 break; 998 999 if (is_reloc(S_SEG, symname)) { 1000 add_reloc(&relocs16, rel->r_offset); 1001 break; 1002 } 1003 } else { 1004 if (!is_reloc(S_LIN, symname)) 1005 break; 1006 } 1007 die("Invalid %s %s relocation: %s\n", 1008 shn_abs ? "absolute" : "relative", 1009 rel_type(r_type), symname); 1010 break; 1011 1012 case R_386_32: 1013 if (shn_abs) { 1014 /* 1015 * Whitelisted absolute symbols do not require 1016 * relocation. 1017 */ 1018 if (is_reloc(S_ABS, symname)) 1019 break; 1020 1021 if (is_reloc(S_REL, symname)) { 1022 add_reloc(&relocs32, rel->r_offset); 1023 break; 1024 } 1025 } else { 1026 if (is_reloc(S_LIN, symname)) 1027 add_reloc(&relocs32, rel->r_offset); 1028 break; 1029 } 1030 die("Invalid %s %s relocation: %s\n", 1031 shn_abs ? "absolute" : "relative", 1032 rel_type(r_type), symname); 1033 break; 1034 1035 default: 1036 die("Unsupported relocation type: %s (%d)\n", 1037 rel_type(r_type), r_type); 1038 break; 1039 } 1040 1041 return 0; 1042 } 1043 1044 #endif 1045 1046 static int cmp_relocs(const void *va, const void *vb) 1047 { 1048 const uint32_t *a, *b; 1049 a = va; b = vb; 1050 return (*a == *b)? 0 : (*a > *b)? 1 : -1; 1051 } 1052 1053 static void sort_relocs(struct relocs *r) 1054 { 1055 qsort(r->offset, r->count, sizeof(r->offset[0]), cmp_relocs); 1056 } 1057 1058 static int write32(uint32_t v, FILE *f) 1059 { 1060 unsigned char buf[4]; 1061 1062 put_unaligned_le32(v, buf); 1063 return fwrite(buf, 1, 4, f) == 4 ? 0 : -1; 1064 } 1065 1066 static int write32_as_text(uint32_t v, FILE *f) 1067 { 1068 return fprintf(f, "\t.long 0x%08"PRIx32"\n", v) > 0 ? 0 : -1; 1069 } 1070 1071 static void emit_relocs(int as_text, int use_real_mode) 1072 { 1073 int i; 1074 int (*write_reloc)(uint32_t, FILE *) = write32; 1075 int (*do_reloc)(struct section *sec, Elf_Rel *rel, Elf_Sym *sym, 1076 const char *symname); 1077 1078 #if ELF_BITS == 64 1079 if (!use_real_mode) 1080 do_reloc = do_reloc64; 1081 else 1082 die("--realmode not valid for a 64-bit ELF file"); 1083 #else 1084 if (!use_real_mode) 1085 do_reloc = do_reloc32; 1086 else 1087 do_reloc = do_reloc_real; 1088 #endif 1089 1090 /* Collect up the relocations */ 1091 walk_relocs(do_reloc); 1092 1093 if (relocs16.count && !use_real_mode) 1094 die("Segment relocations found but --realmode not specified\n"); 1095 1096 /* Order the relocations for more efficient processing */ 1097 sort_relocs(&relocs32); 1098 #if ELF_BITS == 64 1099 sort_relocs(&relocs32neg); 1100 sort_relocs(&relocs64); 1101 #else 1102 sort_relocs(&relocs16); 1103 #endif 1104 1105 /* Print the relocations */ 1106 if (as_text) { 1107 /* Print the relocations in a form suitable that 1108 * gas will like. 1109 */ 1110 printf(".section \".data.reloc\",\"a\"\n"); 1111 printf(".balign 4\n"); 1112 write_reloc = write32_as_text; 1113 } 1114 1115 if (use_real_mode) { 1116 write_reloc(relocs16.count, stdout); 1117 for (i = 0; i < relocs16.count; i++) 1118 write_reloc(relocs16.offset[i], stdout); 1119 1120 write_reloc(relocs32.count, stdout); 1121 for (i = 0; i < relocs32.count; i++) 1122 write_reloc(relocs32.offset[i], stdout); 1123 } else { 1124 #if ELF_BITS == 64 1125 /* Print a stop */ 1126 write_reloc(0, stdout); 1127 1128 /* Now print each relocation */ 1129 for (i = 0; i < relocs64.count; i++) 1130 write_reloc(relocs64.offset[i], stdout); 1131 1132 /* Print a stop */ 1133 write_reloc(0, stdout); 1134 1135 /* Now print each inverse 32-bit relocation */ 1136 for (i = 0; i < relocs32neg.count; i++) 1137 write_reloc(relocs32neg.offset[i], stdout); 1138 #endif 1139 1140 /* Print a stop */ 1141 write_reloc(0, stdout); 1142 1143 /* Now print each relocation */ 1144 for (i = 0; i < relocs32.count; i++) 1145 write_reloc(relocs32.offset[i], stdout); 1146 } 1147 } 1148 1149 /* 1150 * As an aid to debugging problems with different linkers 1151 * print summary information about the relocs. 1152 * Since different linkers tend to emit the sections in 1153 * different orders we use the section names in the output. 1154 */ 1155 static int do_reloc_info(struct section *sec, Elf_Rel *rel, ElfW(Sym) *sym, 1156 const char *symname) 1157 { 1158 printf("%s\t%s\t%s\t%s\n", 1159 sec_name(sec->shdr.sh_info), 1160 rel_type(ELF_R_TYPE(rel->r_info)), 1161 symname, 1162 sec_name(sym_index(sym))); 1163 return 0; 1164 } 1165 1166 static void print_reloc_info(void) 1167 { 1168 printf("reloc section\treloc type\tsymbol\tsymbol section\n"); 1169 walk_relocs(do_reloc_info); 1170 } 1171 1172 #if ELF_BITS == 64 1173 # define process process_64 1174 #else 1175 # define process process_32 1176 #endif 1177 1178 void process(FILE *fp, int use_real_mode, int as_text, 1179 int show_absolute_syms, int show_absolute_relocs, 1180 int show_reloc_info) 1181 { 1182 regex_init(use_real_mode); 1183 read_ehdr(fp); 1184 read_shdrs(fp); 1185 read_strtabs(fp); 1186 read_symtabs(fp); 1187 read_relocs(fp); 1188 if (ELF_BITS == 64) 1189 percpu_init(); 1190 if (show_absolute_syms) { 1191 print_absolute_symbols(); 1192 return; 1193 } 1194 if (show_absolute_relocs) { 1195 print_absolute_relocs(); 1196 return; 1197 } 1198 if (show_reloc_info) { 1199 print_reloc_info(); 1200 return; 1201 } 1202 emit_relocs(as_text, use_real_mode); 1203 } 1204