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