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 "__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 sh_symtab = sec_symtab->symtab; 657 sym_strtab = sec_symtab->link->strtab; 658 for (j = 0; j < sec->shdr.sh_size/sizeof(Elf_Rel); j++) { 659 Elf_Rel *rel; 660 Elf_Sym *sym; 661 const char *name; 662 rel = &sec->reltab[j]; 663 sym = &sh_symtab[ELF_R_SYM(rel->r_info)]; 664 name = sym_name(sym_strtab, sym); 665 if (sym->st_shndx != SHN_ABS) { 666 continue; 667 } 668 669 /* Absolute symbols are not relocated if bzImage is 670 * loaded at a non-compiled address. Display a warning 671 * to user at compile time about the absolute 672 * relocations present. 673 * 674 * User need to audit the code to make sure 675 * some symbols which should have been section 676 * relative have not become absolute because of some 677 * linker optimization or wrong programming usage. 678 * 679 * Before warning check if this absolute symbol 680 * relocation is harmless. 681 */ 682 if (is_reloc(S_ABS, name) || is_reloc(S_REL, name)) 683 continue; 684 685 if (!printed) { 686 printf("WARNING: Absolute relocations" 687 " present\n"); 688 printf("Offset Info Type Sym.Value " 689 "Sym.Name\n"); 690 printed = 1; 691 } 692 693 printf(format, 694 rel->r_offset, 695 rel->r_info, 696 rel_type(ELF_R_TYPE(rel->r_info)), 697 sym->st_value, 698 name); 699 } 700 } 701 702 if (printed) 703 printf("\n"); 704 } 705 706 static void add_reloc(struct relocs *r, uint32_t offset) 707 { 708 if (r->count == r->size) { 709 unsigned long newsize = r->size + 50000; 710 void *mem = realloc(r->offset, newsize * sizeof(r->offset[0])); 711 712 if (!mem) 713 die("realloc of %ld entries for relocs failed\n", 714 newsize); 715 r->offset = mem; 716 r->size = newsize; 717 } 718 r->offset[r->count++] = offset; 719 } 720 721 static void walk_relocs(int (*process)(struct section *sec, Elf_Rel *rel, 722 Elf_Sym *sym, const char *symname)) 723 { 724 int i; 725 /* Walk through the relocations */ 726 for (i = 0; i < shnum; i++) { 727 char *sym_strtab; 728 Elf_Sym *sh_symtab; 729 struct section *sec_applies, *sec_symtab; 730 int j; 731 struct section *sec = &secs[i]; 732 733 if (sec->shdr.sh_type != SHT_REL_TYPE) { 734 continue; 735 } 736 sec_symtab = sec->link; 737 sec_applies = &secs[sec->shdr.sh_info]; 738 if (!(sec_applies->shdr.sh_flags & SHF_ALLOC)) { 739 continue; 740 } 741 sh_symtab = sec_symtab->symtab; 742 sym_strtab = sec_symtab->link->strtab; 743 for (j = 0; j < sec->shdr.sh_size/sizeof(Elf_Rel); j++) { 744 Elf_Rel *rel = &sec->reltab[j]; 745 Elf_Sym *sym = &sh_symtab[ELF_R_SYM(rel->r_info)]; 746 const char *symname = sym_name(sym_strtab, sym); 747 748 process(sec, rel, sym, symname); 749 } 750 } 751 } 752 753 /* 754 * The .data..percpu section is a special case for x86_64 SMP kernels. 755 * It is used to initialize the actual per_cpu areas and to provide 756 * definitions for the per_cpu variables that correspond to their offsets 757 * within the percpu area. Since the values of all of the symbols need 758 * to be offsets from the start of the per_cpu area the virtual address 759 * (sh_addr) of .data..percpu is 0 in SMP kernels. 760 * 761 * This means that: 762 * 763 * Relocations that reference symbols in the per_cpu area do not 764 * need further relocation (since the value is an offset relative 765 * to the start of the per_cpu area that does not change). 766 * 767 * Relocations that apply to the per_cpu area need to have their 768 * offset adjusted by by the value of __per_cpu_load to make them 769 * point to the correct place in the loaded image (because the 770 * virtual address of .data..percpu is 0). 771 * 772 * For non SMP kernels .data..percpu is linked as part of the normal 773 * kernel data and does not require special treatment. 774 * 775 */ 776 static int per_cpu_shndx = -1; 777 static Elf_Addr per_cpu_load_addr; 778 779 static void percpu_init(void) 780 { 781 int i; 782 for (i = 0; i < shnum; i++) { 783 ElfW(Sym) *sym; 784 if (strcmp(sec_name(i), ".data..percpu")) 785 continue; 786 787 if (secs[i].shdr.sh_addr != 0) /* non SMP kernel */ 788 return; 789 790 sym = sym_lookup("__per_cpu_load"); 791 if (!sym) 792 die("can't find __per_cpu_load\n"); 793 794 per_cpu_shndx = i; 795 per_cpu_load_addr = sym->st_value; 796 return; 797 } 798 } 799 800 #if ELF_BITS == 64 801 802 /* 803 * Check to see if a symbol lies in the .data..percpu section. 804 * 805 * The linker incorrectly associates some symbols with the 806 * .data..percpu section so we also need to check the symbol 807 * name to make sure that we classify the symbol correctly. 808 * 809 * The GNU linker incorrectly associates: 810 * __init_begin 811 * __per_cpu_load 812 * 813 * The "gold" linker incorrectly associates: 814 * init_per_cpu__fixed_percpu_data 815 * init_per_cpu__gdt_page 816 */ 817 static int is_percpu_sym(ElfW(Sym) *sym, const char *symname) 818 { 819 int shndx = sym_index(sym); 820 821 return (shndx == per_cpu_shndx) && 822 strcmp(symname, "__init_begin") && 823 strcmp(symname, "__per_cpu_load") && 824 strncmp(symname, "init_per_cpu_", 13); 825 } 826 827 828 static int do_reloc64(struct section *sec, Elf_Rel *rel, ElfW(Sym) *sym, 829 const char *symname) 830 { 831 unsigned r_type = ELF64_R_TYPE(rel->r_info); 832 ElfW(Addr) offset = rel->r_offset; 833 int shn_abs = (sym->st_shndx == SHN_ABS) && !is_reloc(S_REL, symname); 834 835 if (sym->st_shndx == SHN_UNDEF) 836 return 0; 837 838 /* 839 * Adjust the offset if this reloc applies to the percpu section. 840 */ 841 if (sec->shdr.sh_info == per_cpu_shndx) 842 offset += per_cpu_load_addr; 843 844 switch (r_type) { 845 case R_X86_64_NONE: 846 /* NONE can be ignored. */ 847 break; 848 849 case R_X86_64_PC32: 850 case R_X86_64_PLT32: 851 /* 852 * PC relative relocations don't need to be adjusted unless 853 * referencing a percpu symbol. 854 * 855 * NB: R_X86_64_PLT32 can be treated as R_X86_64_PC32. 856 */ 857 if (is_percpu_sym(sym, symname)) 858 add_reloc(&relocs32neg, offset); 859 break; 860 861 case R_X86_64_PC64: 862 /* 863 * Only used by jump labels 864 */ 865 if (is_percpu_sym(sym, symname)) 866 die("Invalid R_X86_64_PC64 relocation against per-CPU symbol %s\n", 867 symname); 868 break; 869 870 case R_X86_64_32: 871 case R_X86_64_32S: 872 case R_X86_64_64: 873 /* 874 * References to the percpu area don't need to be adjusted. 875 */ 876 if (is_percpu_sym(sym, symname)) 877 break; 878 879 if (shn_abs) { 880 /* 881 * Whitelisted absolute symbols do not require 882 * relocation. 883 */ 884 if (is_reloc(S_ABS, symname)) 885 break; 886 887 die("Invalid absolute %s relocation: %s\n", 888 rel_type(r_type), symname); 889 break; 890 } 891 892 /* 893 * Relocation offsets for 64 bit kernels are output 894 * as 32 bits and sign extended back to 64 bits when 895 * the relocations are processed. 896 * Make sure that the offset will fit. 897 */ 898 if ((int32_t)offset != (int64_t)offset) 899 die("Relocation offset doesn't fit in 32 bits\n"); 900 901 if (r_type == R_X86_64_64) 902 add_reloc(&relocs64, offset); 903 else 904 add_reloc(&relocs32, offset); 905 break; 906 907 default: 908 die("Unsupported relocation type: %s (%d)\n", 909 rel_type(r_type), r_type); 910 break; 911 } 912 913 return 0; 914 } 915 916 #else 917 918 static int do_reloc32(struct section *sec, Elf_Rel *rel, Elf_Sym *sym, 919 const char *symname) 920 { 921 unsigned r_type = ELF32_R_TYPE(rel->r_info); 922 int shn_abs = (sym->st_shndx == SHN_ABS) && !is_reloc(S_REL, symname); 923 924 switch (r_type) { 925 case R_386_NONE: 926 case R_386_PC32: 927 case R_386_PC16: 928 case R_386_PC8: 929 case R_386_PLT32: 930 /* 931 * NONE can be ignored and PC relative relocations don't need 932 * to be adjusted. Because sym must be defined, R_386_PLT32 can 933 * be treated the same way as R_386_PC32. 934 */ 935 break; 936 937 case R_386_32: 938 if (shn_abs) { 939 /* 940 * Whitelisted absolute symbols do not require 941 * relocation. 942 */ 943 if (is_reloc(S_ABS, symname)) 944 break; 945 946 die("Invalid absolute %s relocation: %s\n", 947 rel_type(r_type), symname); 948 break; 949 } 950 951 add_reloc(&relocs32, rel->r_offset); 952 break; 953 954 default: 955 die("Unsupported relocation type: %s (%d)\n", 956 rel_type(r_type), r_type); 957 break; 958 } 959 960 return 0; 961 } 962 963 static int do_reloc_real(struct section *sec, Elf_Rel *rel, Elf_Sym *sym, 964 const char *symname) 965 { 966 unsigned r_type = ELF32_R_TYPE(rel->r_info); 967 int shn_abs = (sym->st_shndx == SHN_ABS) && !is_reloc(S_REL, symname); 968 969 switch (r_type) { 970 case R_386_NONE: 971 case R_386_PC32: 972 case R_386_PC16: 973 case R_386_PC8: 974 case R_386_PLT32: 975 /* 976 * NONE can be ignored and PC relative relocations don't need 977 * to be adjusted. Because sym must be defined, R_386_PLT32 can 978 * be treated the same way as R_386_PC32. 979 */ 980 break; 981 982 case R_386_16: 983 if (shn_abs) { 984 /* 985 * Whitelisted absolute symbols do not require 986 * relocation. 987 */ 988 if (is_reloc(S_ABS, symname)) 989 break; 990 991 if (is_reloc(S_SEG, symname)) { 992 add_reloc(&relocs16, rel->r_offset); 993 break; 994 } 995 } else { 996 if (!is_reloc(S_LIN, symname)) 997 break; 998 } 999 die("Invalid %s %s relocation: %s\n", 1000 shn_abs ? "absolute" : "relative", 1001 rel_type(r_type), symname); 1002 break; 1003 1004 case R_386_32: 1005 if (shn_abs) { 1006 /* 1007 * Whitelisted absolute symbols do not require 1008 * relocation. 1009 */ 1010 if (is_reloc(S_ABS, symname)) 1011 break; 1012 1013 if (is_reloc(S_REL, symname)) { 1014 add_reloc(&relocs32, rel->r_offset); 1015 break; 1016 } 1017 } else { 1018 if (is_reloc(S_LIN, symname)) 1019 add_reloc(&relocs32, rel->r_offset); 1020 break; 1021 } 1022 die("Invalid %s %s relocation: %s\n", 1023 shn_abs ? "absolute" : "relative", 1024 rel_type(r_type), symname); 1025 break; 1026 1027 default: 1028 die("Unsupported relocation type: %s (%d)\n", 1029 rel_type(r_type), r_type); 1030 break; 1031 } 1032 1033 return 0; 1034 } 1035 1036 #endif 1037 1038 static int cmp_relocs(const void *va, const void *vb) 1039 { 1040 const uint32_t *a, *b; 1041 a = va; b = vb; 1042 return (*a == *b)? 0 : (*a > *b)? 1 : -1; 1043 } 1044 1045 static void sort_relocs(struct relocs *r) 1046 { 1047 qsort(r->offset, r->count, sizeof(r->offset[0]), cmp_relocs); 1048 } 1049 1050 static int write32(uint32_t v, FILE *f) 1051 { 1052 unsigned char buf[4]; 1053 1054 put_unaligned_le32(v, buf); 1055 return fwrite(buf, 1, 4, f) == 4 ? 0 : -1; 1056 } 1057 1058 static int write32_as_text(uint32_t v, FILE *f) 1059 { 1060 return fprintf(f, "\t.long 0x%08"PRIx32"\n", v) > 0 ? 0 : -1; 1061 } 1062 1063 static void emit_relocs(int as_text, int use_real_mode) 1064 { 1065 int i; 1066 int (*write_reloc)(uint32_t, FILE *) = write32; 1067 int (*do_reloc)(struct section *sec, Elf_Rel *rel, Elf_Sym *sym, 1068 const char *symname); 1069 1070 #if ELF_BITS == 64 1071 if (!use_real_mode) 1072 do_reloc = do_reloc64; 1073 else 1074 die("--realmode not valid for a 64-bit ELF file"); 1075 #else 1076 if (!use_real_mode) 1077 do_reloc = do_reloc32; 1078 else 1079 do_reloc = do_reloc_real; 1080 #endif 1081 1082 /* Collect up the relocations */ 1083 walk_relocs(do_reloc); 1084 1085 if (relocs16.count && !use_real_mode) 1086 die("Segment relocations found but --realmode not specified\n"); 1087 1088 /* Order the relocations for more efficient processing */ 1089 sort_relocs(&relocs32); 1090 #if ELF_BITS == 64 1091 sort_relocs(&relocs32neg); 1092 sort_relocs(&relocs64); 1093 #else 1094 sort_relocs(&relocs16); 1095 #endif 1096 1097 /* Print the relocations */ 1098 if (as_text) { 1099 /* Print the relocations in a form suitable that 1100 * gas will like. 1101 */ 1102 printf(".section \".data.reloc\",\"a\"\n"); 1103 printf(".balign 4\n"); 1104 write_reloc = write32_as_text; 1105 } 1106 1107 if (use_real_mode) { 1108 write_reloc(relocs16.count, stdout); 1109 for (i = 0; i < relocs16.count; i++) 1110 write_reloc(relocs16.offset[i], stdout); 1111 1112 write_reloc(relocs32.count, stdout); 1113 for (i = 0; i < relocs32.count; i++) 1114 write_reloc(relocs32.offset[i], stdout); 1115 } else { 1116 #if ELF_BITS == 64 1117 /* Print a stop */ 1118 write_reloc(0, stdout); 1119 1120 /* Now print each relocation */ 1121 for (i = 0; i < relocs64.count; i++) 1122 write_reloc(relocs64.offset[i], stdout); 1123 1124 /* Print a stop */ 1125 write_reloc(0, stdout); 1126 1127 /* Now print each inverse 32-bit relocation */ 1128 for (i = 0; i < relocs32neg.count; i++) 1129 write_reloc(relocs32neg.offset[i], stdout); 1130 #endif 1131 1132 /* Print a stop */ 1133 write_reloc(0, stdout); 1134 1135 /* Now print each relocation */ 1136 for (i = 0; i < relocs32.count; i++) 1137 write_reloc(relocs32.offset[i], stdout); 1138 } 1139 } 1140 1141 /* 1142 * As an aid to debugging problems with different linkers 1143 * print summary information about the relocs. 1144 * Since different linkers tend to emit the sections in 1145 * different orders we use the section names in the output. 1146 */ 1147 static int do_reloc_info(struct section *sec, Elf_Rel *rel, ElfW(Sym) *sym, 1148 const char *symname) 1149 { 1150 printf("%s\t%s\t%s\t%s\n", 1151 sec_name(sec->shdr.sh_info), 1152 rel_type(ELF_R_TYPE(rel->r_info)), 1153 symname, 1154 sec_name(sym_index(sym))); 1155 return 0; 1156 } 1157 1158 static void print_reloc_info(void) 1159 { 1160 printf("reloc section\treloc type\tsymbol\tsymbol section\n"); 1161 walk_relocs(do_reloc_info); 1162 } 1163 1164 #if ELF_BITS == 64 1165 # define process process_64 1166 #else 1167 # define process process_32 1168 #endif 1169 1170 void process(FILE *fp, int use_real_mode, int as_text, 1171 int show_absolute_syms, int show_absolute_relocs, 1172 int show_reloc_info) 1173 { 1174 regex_init(use_real_mode); 1175 read_ehdr(fp); 1176 read_shdrs(fp); 1177 read_strtabs(fp); 1178 read_symtabs(fp); 1179 read_relocs(fp); 1180 if (ELF_BITS == 64) 1181 percpu_init(); 1182 if (show_absolute_syms) { 1183 print_absolute_symbols(); 1184 return; 1185 } 1186 if (show_absolute_relocs) { 1187 print_absolute_relocs(); 1188 return; 1189 } 1190 if (show_reloc_info) { 1191 print_reloc_info(); 1192 return; 1193 } 1194 emit_relocs(as_text, use_real_mode); 1195 } 1196