xref: /kvm-unit-tests/lib/elf.h (revision 6444ae208ce0085d0f5c5ffb15909ca3bbd49c84)
12ae585d7SNikos Nikoleris /* SPDX-License-Identifier: LGPL-2.0-or-later */
22ae585d7SNikos Nikoleris /*
32ae585d7SNikos Nikoleris  * Relevant definitions from uapi/linux/elf.h and asm/elf.h
42ae585d7SNikos Nikoleris  */
52ae585d7SNikos Nikoleris 
62ae585d7SNikos Nikoleris #ifndef _ELF_H_
72ae585d7SNikos Nikoleris #define _ELF_H_
82ae585d7SNikos Nikoleris 
92ae585d7SNikos Nikoleris #include <libcflat.h>
102ae585d7SNikos Nikoleris 
113b10c7e2SAndrew Jones /* 32-bit ELF base types. */
123b10c7e2SAndrew Jones typedef u32	Elf32_Addr;
133b10c7e2SAndrew Jones typedef u32	Elf32_Xword;
143b10c7e2SAndrew Jones typedef s32	Elf32_Sxword;
153b10c7e2SAndrew Jones 
162ae585d7SNikos Nikoleris /* 64-bit ELF base types. */
172ae585d7SNikos Nikoleris typedef u64	Elf64_Addr;
182ae585d7SNikos Nikoleris typedef u64	Elf64_Xword;
192ae585d7SNikos Nikoleris typedef s64	Elf64_Sxword;
202ae585d7SNikos Nikoleris 
212ae585d7SNikos Nikoleris typedef struct {
222ae585d7SNikos Nikoleris 	Elf64_Sxword d_tag;             /* entry tag value */
232ae585d7SNikos Nikoleris 	union {
242ae585d7SNikos Nikoleris 		Elf64_Xword d_val;
252ae585d7SNikos Nikoleris 		Elf64_Addr d_ptr;
262ae585d7SNikos Nikoleris 	} d_un;
272ae585d7SNikos Nikoleris } Elf64_Dyn;
282ae585d7SNikos Nikoleris 
292ae585d7SNikos Nikoleris typedef struct elf64_rel {
302ae585d7SNikos Nikoleris 	Elf64_Addr r_offset;    /* Location at which to apply the action */
312ae585d7SNikos Nikoleris 	Elf64_Xword r_info;     /* index and type of relocation */
322ae585d7SNikos Nikoleris } Elf64_Rel;
332ae585d7SNikos Nikoleris 
343b10c7e2SAndrew Jones typedef struct elf32_rela {
353b10c7e2SAndrew Jones 	Elf32_Addr r_offset;    /* Location at which to apply the action */
363b10c7e2SAndrew Jones 	Elf32_Xword r_info;     /* index and type of relocation */
373b10c7e2SAndrew Jones 	Elf32_Sxword r_addend;  /* Constant addend used to compute value */
383b10c7e2SAndrew Jones } Elf32_Rela;
393b10c7e2SAndrew Jones 
402ae585d7SNikos Nikoleris typedef struct elf64_rela {
412ae585d7SNikos Nikoleris 	Elf64_Addr r_offset;    /* Location at which to apply the action */
422ae585d7SNikos Nikoleris 	Elf64_Xword r_info;     /* index and type of relocation */
432ae585d7SNikos Nikoleris 	Elf64_Sxword r_addend;  /* Constant addend used to compute value */
442ae585d7SNikos Nikoleris } Elf64_Rela;
452ae585d7SNikos Nikoleris 
462ae585d7SNikos Nikoleris /* This is the info that is needed to parse the dynamic section of the file */
472ae585d7SNikos Nikoleris #define DT_NULL		0
482ae585d7SNikos Nikoleris #define DT_RELA		7
492ae585d7SNikos Nikoleris #define DT_RELASZ	8
502ae585d7SNikos Nikoleris #define DT_RELAENT	9
512ae585d7SNikos Nikoleris 
522ae585d7SNikos Nikoleris /* x86 relocation types. */
532ae585d7SNikos Nikoleris #define R_X86_64_NONE		0       /* No reloc */
542ae585d7SNikos Nikoleris #define R_X86_64_RELATIVE	8       /* Adjust by program base */
552ae585d7SNikos Nikoleris 
562ae585d7SNikos Nikoleris 
572ae585d7SNikos Nikoleris /*
582ae585d7SNikos Nikoleris  * AArch64 static relocation types.
592ae585d7SNikos Nikoleris  */
602ae585d7SNikos Nikoleris 
612ae585d7SNikos Nikoleris /* Miscellaneous. */
622ae585d7SNikos Nikoleris #define R_AARCH64_NONE		256
632ae585d7SNikos Nikoleris #define R_AARCH64_RELATIVE	1027
642ae585d7SNikos Nikoleris 
652ae585d7SNikos Nikoleris /* The following are used with relocations */
662ae585d7SNikos Nikoleris #define ELF64_R_TYPE(i)		((i) & 0xffffffff)
672ae585d7SNikos Nikoleris 
68*a403033cSAndrew Jones /*
69*a403033cSAndrew Jones  * riscv static relocation types.
70*a403033cSAndrew Jones  */
71*a403033cSAndrew Jones #define R_RISCV_RELATIVE	3
72*a403033cSAndrew Jones 
732ae585d7SNikos Nikoleris #endif /* _ELF_H_ */
74