xref: /kvm-unit-tests/lib/elf.h (revision 2ae585d796f9438a2bbfff9ee16c50e999ff4f37)
1*2ae585d7SNikos Nikoleris /* SPDX-License-Identifier: LGPL-2.0-or-later */
2*2ae585d7SNikos Nikoleris /*
3*2ae585d7SNikos Nikoleris  * Relevant definitions from uapi/linux/elf.h and asm/elf.h
4*2ae585d7SNikos Nikoleris  */
5*2ae585d7SNikos Nikoleris 
6*2ae585d7SNikos Nikoleris #ifndef _ELF_H_
7*2ae585d7SNikos Nikoleris #define _ELF_H_
8*2ae585d7SNikos Nikoleris 
9*2ae585d7SNikos Nikoleris #include <libcflat.h>
10*2ae585d7SNikos Nikoleris 
11*2ae585d7SNikos Nikoleris /* 64-bit ELF base types. */
12*2ae585d7SNikos Nikoleris typedef u64	Elf64_Addr;
13*2ae585d7SNikos Nikoleris typedef u64	Elf64_Xword;
14*2ae585d7SNikos Nikoleris typedef s64	Elf64_Sxword;
15*2ae585d7SNikos Nikoleris 
16*2ae585d7SNikos Nikoleris typedef struct {
17*2ae585d7SNikos Nikoleris 	Elf64_Sxword d_tag;             /* entry tag value */
18*2ae585d7SNikos Nikoleris 	union {
19*2ae585d7SNikos Nikoleris 		Elf64_Xword d_val;
20*2ae585d7SNikos Nikoleris 		Elf64_Addr d_ptr;
21*2ae585d7SNikos Nikoleris 	} d_un;
22*2ae585d7SNikos Nikoleris } Elf64_Dyn;
23*2ae585d7SNikos Nikoleris 
24*2ae585d7SNikos Nikoleris typedef struct elf64_rel {
25*2ae585d7SNikos Nikoleris 	Elf64_Addr r_offset;    /* Location at which to apply the action */
26*2ae585d7SNikos Nikoleris 	Elf64_Xword r_info;     /* index and type of relocation */
27*2ae585d7SNikos Nikoleris } Elf64_Rel;
28*2ae585d7SNikos Nikoleris 
29*2ae585d7SNikos Nikoleris typedef struct elf64_rela {
30*2ae585d7SNikos Nikoleris 	Elf64_Addr r_offset;    /* Location at which to apply the action */
31*2ae585d7SNikos Nikoleris 	Elf64_Xword r_info;     /* index and type of relocation */
32*2ae585d7SNikos Nikoleris 	Elf64_Sxword r_addend;  /* Constant addend used to compute value */
33*2ae585d7SNikos Nikoleris } Elf64_Rela;
34*2ae585d7SNikos Nikoleris 
35*2ae585d7SNikos Nikoleris /* This is the info that is needed to parse the dynamic section of the file */
36*2ae585d7SNikos Nikoleris #define DT_NULL		0
37*2ae585d7SNikos Nikoleris #define DT_RELA		7
38*2ae585d7SNikos Nikoleris #define DT_RELASZ	8
39*2ae585d7SNikos Nikoleris #define DT_RELAENT	9
40*2ae585d7SNikos Nikoleris 
41*2ae585d7SNikos Nikoleris /* x86 relocation types. */
42*2ae585d7SNikos Nikoleris #define R_X86_64_NONE		0       /* No reloc */
43*2ae585d7SNikos Nikoleris #define R_X86_64_RELATIVE	8       /* Adjust by program base */
44*2ae585d7SNikos Nikoleris 
45*2ae585d7SNikos Nikoleris 
46*2ae585d7SNikos Nikoleris /*
47*2ae585d7SNikos Nikoleris  * AArch64 static relocation types.
48*2ae585d7SNikos Nikoleris  */
49*2ae585d7SNikos Nikoleris 
50*2ae585d7SNikos Nikoleris /* Miscellaneous. */
51*2ae585d7SNikos Nikoleris #define R_AARCH64_NONE		256
52*2ae585d7SNikos Nikoleris #define R_AARCH64_RELATIVE	1027
53*2ae585d7SNikos Nikoleris 
54*2ae585d7SNikos Nikoleris /* The following are used with relocations */
55*2ae585d7SNikos Nikoleris #define ELF64_R_TYPE(i)		((i) & 0xffffffff)
56*2ae585d7SNikos Nikoleris 
57*2ae585d7SNikos Nikoleris #endif /* _ELF_H_ */
58