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