xref: /openbmc/linux/arch/x86/tools/relocs.c (revision adb57164)
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 		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 		/*
871 		 * NONE can be ignored and PC relative relocations don't
872 		 * need to be adjusted.
873 		 */
874 		break;
875 
876 	case R_386_32:
877 		if (shn_abs) {
878 			/*
879 			 * Whitelisted absolute symbols do not require
880 			 * relocation.
881 			 */
882 			if (is_reloc(S_ABS, symname))
883 				break;
884 
885 			die("Invalid absolute %s relocation: %s\n",
886 			    rel_type(r_type), symname);
887 			break;
888 		}
889 
890 		add_reloc(&relocs32, rel->r_offset);
891 		break;
892 
893 	default:
894 		die("Unsupported relocation type: %s (%d)\n",
895 		    rel_type(r_type), r_type);
896 		break;
897 	}
898 
899 	return 0;
900 }
901 
902 static int do_reloc_real(struct section *sec, Elf_Rel *rel, Elf_Sym *sym,
903 			 const char *symname)
904 {
905 	unsigned r_type = ELF32_R_TYPE(rel->r_info);
906 	int shn_abs = (sym->st_shndx == SHN_ABS) && !is_reloc(S_REL, symname);
907 
908 	switch (r_type) {
909 	case R_386_NONE:
910 	case R_386_PC32:
911 	case R_386_PC16:
912 	case R_386_PC8:
913 		/*
914 		 * NONE can be ignored and PC relative relocations don't
915 		 * need to be adjusted.
916 		 */
917 		break;
918 
919 	case R_386_16:
920 		if (shn_abs) {
921 			/*
922 			 * Whitelisted absolute symbols do not require
923 			 * relocation.
924 			 */
925 			if (is_reloc(S_ABS, symname))
926 				break;
927 
928 			if (is_reloc(S_SEG, symname)) {
929 				add_reloc(&relocs16, rel->r_offset);
930 				break;
931 			}
932 		} else {
933 			if (!is_reloc(S_LIN, symname))
934 				break;
935 		}
936 		die("Invalid %s %s relocation: %s\n",
937 		    shn_abs ? "absolute" : "relative",
938 		    rel_type(r_type), symname);
939 		break;
940 
941 	case R_386_32:
942 		if (shn_abs) {
943 			/*
944 			 * Whitelisted absolute symbols do not require
945 			 * relocation.
946 			 */
947 			if (is_reloc(S_ABS, symname))
948 				break;
949 
950 			if (is_reloc(S_REL, symname)) {
951 				add_reloc(&relocs32, rel->r_offset);
952 				break;
953 			}
954 		} else {
955 			if (is_reloc(S_LIN, symname))
956 				add_reloc(&relocs32, rel->r_offset);
957 			break;
958 		}
959 		die("Invalid %s %s relocation: %s\n",
960 		    shn_abs ? "absolute" : "relative",
961 		    rel_type(r_type), symname);
962 		break;
963 
964 	default:
965 		die("Unsupported relocation type: %s (%d)\n",
966 		    rel_type(r_type), r_type);
967 		break;
968 	}
969 
970 	return 0;
971 }
972 
973 #endif
974 
975 static int cmp_relocs(const void *va, const void *vb)
976 {
977 	const uint32_t *a, *b;
978 	a = va; b = vb;
979 	return (*a == *b)? 0 : (*a > *b)? 1 : -1;
980 }
981 
982 static void sort_relocs(struct relocs *r)
983 {
984 	qsort(r->offset, r->count, sizeof(r->offset[0]), cmp_relocs);
985 }
986 
987 static int write32(uint32_t v, FILE *f)
988 {
989 	unsigned char buf[4];
990 
991 	put_unaligned_le32(v, buf);
992 	return fwrite(buf, 1, 4, f) == 4 ? 0 : -1;
993 }
994 
995 static int write32_as_text(uint32_t v, FILE *f)
996 {
997 	return fprintf(f, "\t.long 0x%08"PRIx32"\n", v) > 0 ? 0 : -1;
998 }
999 
1000 static void emit_relocs(int as_text, int use_real_mode)
1001 {
1002 	int i;
1003 	int (*write_reloc)(uint32_t, FILE *) = write32;
1004 	int (*do_reloc)(struct section *sec, Elf_Rel *rel, Elf_Sym *sym,
1005 			const char *symname);
1006 
1007 #if ELF_BITS == 64
1008 	if (!use_real_mode)
1009 		do_reloc = do_reloc64;
1010 	else
1011 		die("--realmode not valid for a 64-bit ELF file");
1012 #else
1013 	if (!use_real_mode)
1014 		do_reloc = do_reloc32;
1015 	else
1016 		do_reloc = do_reloc_real;
1017 #endif
1018 
1019 	/* Collect up the relocations */
1020 	walk_relocs(do_reloc);
1021 
1022 	if (relocs16.count && !use_real_mode)
1023 		die("Segment relocations found but --realmode not specified\n");
1024 
1025 	/* Order the relocations for more efficient processing */
1026 	sort_relocs(&relocs32);
1027 #if ELF_BITS == 64
1028 	sort_relocs(&relocs32neg);
1029 	sort_relocs(&relocs64);
1030 #else
1031 	sort_relocs(&relocs16);
1032 #endif
1033 
1034 	/* Print the relocations */
1035 	if (as_text) {
1036 		/* Print the relocations in a form suitable that
1037 		 * gas will like.
1038 		 */
1039 		printf(".section \".data.reloc\",\"a\"\n");
1040 		printf(".balign 4\n");
1041 		write_reloc = write32_as_text;
1042 	}
1043 
1044 	if (use_real_mode) {
1045 		write_reloc(relocs16.count, stdout);
1046 		for (i = 0; i < relocs16.count; i++)
1047 			write_reloc(relocs16.offset[i], stdout);
1048 
1049 		write_reloc(relocs32.count, stdout);
1050 		for (i = 0; i < relocs32.count; i++)
1051 			write_reloc(relocs32.offset[i], stdout);
1052 	} else {
1053 #if ELF_BITS == 64
1054 		/* Print a stop */
1055 		write_reloc(0, stdout);
1056 
1057 		/* Now print each relocation */
1058 		for (i = 0; i < relocs64.count; i++)
1059 			write_reloc(relocs64.offset[i], stdout);
1060 
1061 		/* Print a stop */
1062 		write_reloc(0, stdout);
1063 
1064 		/* Now print each inverse 32-bit relocation */
1065 		for (i = 0; i < relocs32neg.count; i++)
1066 			write_reloc(relocs32neg.offset[i], stdout);
1067 #endif
1068 
1069 		/* Print a stop */
1070 		write_reloc(0, stdout);
1071 
1072 		/* Now print each relocation */
1073 		for (i = 0; i < relocs32.count; i++)
1074 			write_reloc(relocs32.offset[i], stdout);
1075 	}
1076 }
1077 
1078 /*
1079  * As an aid to debugging problems with different linkers
1080  * print summary information about the relocs.
1081  * Since different linkers tend to emit the sections in
1082  * different orders we use the section names in the output.
1083  */
1084 static int do_reloc_info(struct section *sec, Elf_Rel *rel, ElfW(Sym) *sym,
1085 				const char *symname)
1086 {
1087 	printf("%s\t%s\t%s\t%s\n",
1088 		sec_name(sec->shdr.sh_info),
1089 		rel_type(ELF_R_TYPE(rel->r_info)),
1090 		symname,
1091 		sec_name(sym->st_shndx));
1092 	return 0;
1093 }
1094 
1095 static void print_reloc_info(void)
1096 {
1097 	printf("reloc section\treloc type\tsymbol\tsymbol section\n");
1098 	walk_relocs(do_reloc_info);
1099 }
1100 
1101 #if ELF_BITS == 64
1102 # define process process_64
1103 #else
1104 # define process process_32
1105 #endif
1106 
1107 void process(FILE *fp, int use_real_mode, int as_text,
1108 	     int show_absolute_syms, int show_absolute_relocs,
1109 	     int show_reloc_info)
1110 {
1111 	regex_init(use_real_mode);
1112 	read_ehdr(fp);
1113 	read_shdrs(fp);
1114 	read_strtabs(fp);
1115 	read_symtabs(fp);
1116 	read_relocs(fp);
1117 	if (ELF_BITS == 64)
1118 		percpu_init();
1119 	if (show_absolute_syms) {
1120 		print_absolute_symbols();
1121 		return;
1122 	}
1123 	if (show_absolute_relocs) {
1124 		print_absolute_relocs();
1125 		return;
1126 	}
1127 	if (show_reloc_info) {
1128 		print_reloc_info();
1129 		return;
1130 	}
1131 	emit_relocs(as_text, use_real_mode);
1132 }
1133