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