ELF: fix all "Elf" typos
[linux-block.git] / arch / x86 / tools / relocs.c
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                 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 }