xref: /linux-6.15/tools/include/uapi/linux/elf.h (revision 626fd352)
1*626fd352SThomas Weißschuh /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2*626fd352SThomas Weißschuh #ifndef _LINUX_ELF_H
3*626fd352SThomas Weißschuh #define _LINUX_ELF_H
4*626fd352SThomas Weißschuh 
5*626fd352SThomas Weißschuh #include <linux/types.h>
6*626fd352SThomas Weißschuh #include <linux/elf-em.h>
7*626fd352SThomas Weißschuh 
8*626fd352SThomas Weißschuh /* 32-bit ELF base types. */
9*626fd352SThomas Weißschuh typedef __u32	Elf32_Addr;
10*626fd352SThomas Weißschuh typedef __u16	Elf32_Half;
11*626fd352SThomas Weißschuh typedef __u32	Elf32_Off;
12*626fd352SThomas Weißschuh typedef __s32	Elf32_Sword;
13*626fd352SThomas Weißschuh typedef __u32	Elf32_Word;
14*626fd352SThomas Weißschuh typedef __u16	Elf32_Versym;
15*626fd352SThomas Weißschuh 
16*626fd352SThomas Weißschuh /* 64-bit ELF base types. */
17*626fd352SThomas Weißschuh typedef __u64	Elf64_Addr;
18*626fd352SThomas Weißschuh typedef __u16	Elf64_Half;
19*626fd352SThomas Weißschuh typedef __s16	Elf64_SHalf;
20*626fd352SThomas Weißschuh typedef __u64	Elf64_Off;
21*626fd352SThomas Weißschuh typedef __s32	Elf64_Sword;
22*626fd352SThomas Weißschuh typedef __u32	Elf64_Word;
23*626fd352SThomas Weißschuh typedef __u64	Elf64_Xword;
24*626fd352SThomas Weißschuh typedef __s64	Elf64_Sxword;
25*626fd352SThomas Weißschuh typedef __u16	Elf64_Versym;
26*626fd352SThomas Weißschuh 
27*626fd352SThomas Weißschuh /* These constants are for the segment types stored in the image headers */
28*626fd352SThomas Weißschuh #define PT_NULL    0
29*626fd352SThomas Weißschuh #define PT_LOAD    1
30*626fd352SThomas Weißschuh #define PT_DYNAMIC 2
31*626fd352SThomas Weißschuh #define PT_INTERP  3
32*626fd352SThomas Weißschuh #define PT_NOTE    4
33*626fd352SThomas Weißschuh #define PT_SHLIB   5
34*626fd352SThomas Weißschuh #define PT_PHDR    6
35*626fd352SThomas Weißschuh #define PT_TLS     7		/* Thread local storage segment */
36*626fd352SThomas Weißschuh #define PT_LOOS    0x60000000	/* OS-specific */
37*626fd352SThomas Weißschuh #define PT_HIOS    0x6fffffff	/* OS-specific */
38*626fd352SThomas Weißschuh #define PT_LOPROC  0x70000000
39*626fd352SThomas Weißschuh #define PT_HIPROC  0x7fffffff
40*626fd352SThomas Weißschuh #define PT_GNU_EH_FRAME	(PT_LOOS + 0x474e550)
41*626fd352SThomas Weißschuh #define PT_GNU_STACK	(PT_LOOS + 0x474e551)
42*626fd352SThomas Weißschuh #define PT_GNU_RELRO	(PT_LOOS + 0x474e552)
43*626fd352SThomas Weißschuh #define PT_GNU_PROPERTY	(PT_LOOS + 0x474e553)
44*626fd352SThomas Weißschuh 
45*626fd352SThomas Weißschuh 
46*626fd352SThomas Weißschuh /* ARM MTE memory tag segment type */
47*626fd352SThomas Weißschuh #define PT_AARCH64_MEMTAG_MTE	(PT_LOPROC + 0x2)
48*626fd352SThomas Weißschuh 
49*626fd352SThomas Weißschuh /*
50*626fd352SThomas Weißschuh  * Extended Numbering
51*626fd352SThomas Weißschuh  *
52*626fd352SThomas Weißschuh  * If the real number of program header table entries is larger than
53*626fd352SThomas Weißschuh  * or equal to PN_XNUM(0xffff), it is set to sh_info field of the
54*626fd352SThomas Weißschuh  * section header at index 0, and PN_XNUM is set to e_phnum
55*626fd352SThomas Weißschuh  * field. Otherwise, the section header at index 0 is zero
56*626fd352SThomas Weißschuh  * initialized, if it exists.
57*626fd352SThomas Weißschuh  *
58*626fd352SThomas Weißschuh  * Specifications are available in:
59*626fd352SThomas Weißschuh  *
60*626fd352SThomas Weißschuh  * - Oracle: Linker and Libraries.
61*626fd352SThomas Weißschuh  *   Part No: 817–1984–19, August 2011.
62*626fd352SThomas Weißschuh  *   https://docs.oracle.com/cd/E18752_01/pdf/817-1984.pdf
63*626fd352SThomas Weißschuh  *
64*626fd352SThomas Weißschuh  * - System V ABI AMD64 Architecture Processor Supplement
65*626fd352SThomas Weißschuh  *   Draft Version 0.99.4,
66*626fd352SThomas Weißschuh  *   January 13, 2010.
67*626fd352SThomas Weißschuh  *   http://www.cs.washington.edu/education/courses/cse351/12wi/supp-docs/abi.pdf
68*626fd352SThomas Weißschuh  */
69*626fd352SThomas Weißschuh #define PN_XNUM 0xffff
70*626fd352SThomas Weißschuh 
71*626fd352SThomas Weißschuh /* These constants define the different elf file types */
72*626fd352SThomas Weißschuh #define ET_NONE   0
73*626fd352SThomas Weißschuh #define ET_REL    1
74*626fd352SThomas Weißschuh #define ET_EXEC   2
75*626fd352SThomas Weißschuh #define ET_DYN    3
76*626fd352SThomas Weißschuh #define ET_CORE   4
77*626fd352SThomas Weißschuh #define ET_LOPROC 0xff00
78*626fd352SThomas Weißschuh #define ET_HIPROC 0xffff
79*626fd352SThomas Weißschuh 
80*626fd352SThomas Weißschuh /* This is the info that is needed to parse the dynamic section of the file */
81*626fd352SThomas Weißschuh #define DT_NULL		0
82*626fd352SThomas Weißschuh #define DT_NEEDED	1
83*626fd352SThomas Weißschuh #define DT_PLTRELSZ	2
84*626fd352SThomas Weißschuh #define DT_PLTGOT	3
85*626fd352SThomas Weißschuh #define DT_HASH		4
86*626fd352SThomas Weißschuh #define DT_STRTAB	5
87*626fd352SThomas Weißschuh #define DT_SYMTAB	6
88*626fd352SThomas Weißschuh #define DT_RELA		7
89*626fd352SThomas Weißschuh #define DT_RELASZ	8
90*626fd352SThomas Weißschuh #define DT_RELAENT	9
91*626fd352SThomas Weißschuh #define DT_STRSZ	10
92*626fd352SThomas Weißschuh #define DT_SYMENT	11
93*626fd352SThomas Weißschuh #define DT_INIT		12
94*626fd352SThomas Weißschuh #define DT_FINI		13
95*626fd352SThomas Weißschuh #define DT_SONAME	14
96*626fd352SThomas Weißschuh #define DT_RPATH	15
97*626fd352SThomas Weißschuh #define DT_SYMBOLIC	16
98*626fd352SThomas Weißschuh #define DT_REL		17
99*626fd352SThomas Weißschuh #define DT_RELSZ	18
100*626fd352SThomas Weißschuh #define DT_RELENT	19
101*626fd352SThomas Weißschuh #define DT_PLTREL	20
102*626fd352SThomas Weißschuh #define DT_DEBUG	21
103*626fd352SThomas Weißschuh #define DT_TEXTREL	22
104*626fd352SThomas Weißschuh #define DT_JMPREL	23
105*626fd352SThomas Weißschuh #define DT_ENCODING	32
106*626fd352SThomas Weißschuh #define OLD_DT_LOOS	0x60000000
107*626fd352SThomas Weißschuh #define DT_LOOS		0x6000000d
108*626fd352SThomas Weißschuh #define DT_HIOS		0x6ffff000
109*626fd352SThomas Weißschuh #define DT_VALRNGLO	0x6ffffd00
110*626fd352SThomas Weißschuh #define DT_VALRNGHI	0x6ffffdff
111*626fd352SThomas Weißschuh #define DT_ADDRRNGLO	0x6ffffe00
112*626fd352SThomas Weißschuh #define DT_GNU_HASH	0x6ffffef5
113*626fd352SThomas Weißschuh #define DT_ADDRRNGHI	0x6ffffeff
114*626fd352SThomas Weißschuh #define DT_VERSYM	0x6ffffff0
115*626fd352SThomas Weißschuh #define DT_RELACOUNT	0x6ffffff9
116*626fd352SThomas Weißschuh #define DT_RELCOUNT	0x6ffffffa
117*626fd352SThomas Weißschuh #define DT_FLAGS_1	0x6ffffffb
118*626fd352SThomas Weißschuh #define DT_VERDEF	0x6ffffffc
119*626fd352SThomas Weißschuh #define	DT_VERDEFNUM	0x6ffffffd
120*626fd352SThomas Weißschuh #define DT_VERNEED	0x6ffffffe
121*626fd352SThomas Weißschuh #define	DT_VERNEEDNUM	0x6fffffff
122*626fd352SThomas Weißschuh #define OLD_DT_HIOS     0x6fffffff
123*626fd352SThomas Weißschuh #define DT_LOPROC	0x70000000
124*626fd352SThomas Weißschuh #define DT_HIPROC	0x7fffffff
125*626fd352SThomas Weißschuh 
126*626fd352SThomas Weißschuh /* This info is needed when parsing the symbol table */
127*626fd352SThomas Weißschuh #define STB_LOCAL  0
128*626fd352SThomas Weißschuh #define STB_GLOBAL 1
129*626fd352SThomas Weißschuh #define STB_WEAK   2
130*626fd352SThomas Weißschuh 
131*626fd352SThomas Weißschuh #define STN_UNDEF 0
132*626fd352SThomas Weißschuh 
133*626fd352SThomas Weißschuh #define STT_NOTYPE  0
134*626fd352SThomas Weißschuh #define STT_OBJECT  1
135*626fd352SThomas Weißschuh #define STT_FUNC    2
136*626fd352SThomas Weißschuh #define STT_SECTION 3
137*626fd352SThomas Weißschuh #define STT_FILE    4
138*626fd352SThomas Weißschuh #define STT_COMMON  5
139*626fd352SThomas Weißschuh #define STT_TLS     6
140*626fd352SThomas Weißschuh 
141*626fd352SThomas Weißschuh #define VER_FLG_BASE 0x1
142*626fd352SThomas Weißschuh #define VER_FLG_WEAK 0x2
143*626fd352SThomas Weißschuh 
144*626fd352SThomas Weißschuh #define ELF_ST_BIND(x)		((x) >> 4)
145*626fd352SThomas Weißschuh #define ELF_ST_TYPE(x)		((x) & 0xf)
146*626fd352SThomas Weißschuh #define ELF32_ST_BIND(x)	ELF_ST_BIND(x)
147*626fd352SThomas Weißschuh #define ELF32_ST_TYPE(x)	ELF_ST_TYPE(x)
148*626fd352SThomas Weißschuh #define ELF64_ST_BIND(x)	ELF_ST_BIND(x)
149*626fd352SThomas Weißschuh #define ELF64_ST_TYPE(x)	ELF_ST_TYPE(x)
150*626fd352SThomas Weißschuh 
151*626fd352SThomas Weißschuh typedef struct {
152*626fd352SThomas Weißschuh   Elf32_Sword d_tag;
153*626fd352SThomas Weißschuh   union {
154*626fd352SThomas Weißschuh     Elf32_Sword	d_val;
155*626fd352SThomas Weißschuh     Elf32_Addr	d_ptr;
156*626fd352SThomas Weißschuh   } d_un;
157*626fd352SThomas Weißschuh } Elf32_Dyn;
158*626fd352SThomas Weißschuh 
159*626fd352SThomas Weißschuh typedef struct {
160*626fd352SThomas Weißschuh   Elf64_Sxword d_tag;		/* entry tag value */
161*626fd352SThomas Weißschuh   union {
162*626fd352SThomas Weißschuh     Elf64_Xword d_val;
163*626fd352SThomas Weißschuh     Elf64_Addr d_ptr;
164*626fd352SThomas Weißschuh   } d_un;
165*626fd352SThomas Weißschuh } Elf64_Dyn;
166*626fd352SThomas Weißschuh 
167*626fd352SThomas Weißschuh /* The following are used with relocations */
168*626fd352SThomas Weißschuh #define ELF32_R_SYM(x) ((x) >> 8)
169*626fd352SThomas Weißschuh #define ELF32_R_TYPE(x) ((x) & 0xff)
170*626fd352SThomas Weißschuh 
171*626fd352SThomas Weißschuh #define ELF64_R_SYM(i)			((i) >> 32)
172*626fd352SThomas Weißschuh #define ELF64_R_TYPE(i)			((i) & 0xffffffff)
173*626fd352SThomas Weißschuh 
174*626fd352SThomas Weißschuh typedef struct elf32_rel {
175*626fd352SThomas Weißschuh   Elf32_Addr	r_offset;
176*626fd352SThomas Weißschuh   Elf32_Word	r_info;
177*626fd352SThomas Weißschuh } Elf32_Rel;
178*626fd352SThomas Weißschuh 
179*626fd352SThomas Weißschuh typedef struct elf64_rel {
180*626fd352SThomas Weißschuh   Elf64_Addr r_offset;	/* Location at which to apply the action */
181*626fd352SThomas Weißschuh   Elf64_Xword r_info;	/* index and type of relocation */
182*626fd352SThomas Weißschuh } Elf64_Rel;
183*626fd352SThomas Weißschuh 
184*626fd352SThomas Weißschuh typedef struct elf32_rela {
185*626fd352SThomas Weißschuh   Elf32_Addr	r_offset;
186*626fd352SThomas Weißschuh   Elf32_Word	r_info;
187*626fd352SThomas Weißschuh   Elf32_Sword	r_addend;
188*626fd352SThomas Weißschuh } Elf32_Rela;
189*626fd352SThomas Weißschuh 
190*626fd352SThomas Weißschuh typedef struct elf64_rela {
191*626fd352SThomas Weißschuh   Elf64_Addr r_offset;	/* Location at which to apply the action */
192*626fd352SThomas Weißschuh   Elf64_Xword r_info;	/* index and type of relocation */
193*626fd352SThomas Weißschuh   Elf64_Sxword r_addend;	/* Constant addend used to compute value */
194*626fd352SThomas Weißschuh } Elf64_Rela;
195*626fd352SThomas Weißschuh 
196*626fd352SThomas Weißschuh typedef struct elf32_sym {
197*626fd352SThomas Weißschuh   Elf32_Word	st_name;
198*626fd352SThomas Weißschuh   Elf32_Addr	st_value;
199*626fd352SThomas Weißschuh   Elf32_Word	st_size;
200*626fd352SThomas Weißschuh   unsigned char	st_info;
201*626fd352SThomas Weißschuh   unsigned char	st_other;
202*626fd352SThomas Weißschuh   Elf32_Half	st_shndx;
203*626fd352SThomas Weißschuh } Elf32_Sym;
204*626fd352SThomas Weißschuh 
205*626fd352SThomas Weißschuh typedef struct elf64_sym {
206*626fd352SThomas Weißschuh   Elf64_Word st_name;		/* Symbol name, index in string tbl */
207*626fd352SThomas Weißschuh   unsigned char	st_info;	/* Type and binding attributes */
208*626fd352SThomas Weißschuh   unsigned char	st_other;	/* No defined meaning, 0 */
209*626fd352SThomas Weißschuh   Elf64_Half st_shndx;		/* Associated section index */
210*626fd352SThomas Weißschuh   Elf64_Addr st_value;		/* Value of the symbol */
211*626fd352SThomas Weißschuh   Elf64_Xword st_size;		/* Associated symbol size */
212*626fd352SThomas Weißschuh } Elf64_Sym;
213*626fd352SThomas Weißschuh 
214*626fd352SThomas Weißschuh 
215*626fd352SThomas Weißschuh #define EI_NIDENT	16
216*626fd352SThomas Weißschuh 
217*626fd352SThomas Weißschuh typedef struct elf32_hdr {
218*626fd352SThomas Weißschuh   unsigned char	e_ident[EI_NIDENT];
219*626fd352SThomas Weißschuh   Elf32_Half	e_type;
220*626fd352SThomas Weißschuh   Elf32_Half	e_machine;
221*626fd352SThomas Weißschuh   Elf32_Word	e_version;
222*626fd352SThomas Weißschuh   Elf32_Addr	e_entry;  /* Entry point */
223*626fd352SThomas Weißschuh   Elf32_Off	e_phoff;
224*626fd352SThomas Weißschuh   Elf32_Off	e_shoff;
225*626fd352SThomas Weißschuh   Elf32_Word	e_flags;
226*626fd352SThomas Weißschuh   Elf32_Half	e_ehsize;
227*626fd352SThomas Weißschuh   Elf32_Half	e_phentsize;
228*626fd352SThomas Weißschuh   Elf32_Half	e_phnum;
229*626fd352SThomas Weißschuh   Elf32_Half	e_shentsize;
230*626fd352SThomas Weißschuh   Elf32_Half	e_shnum;
231*626fd352SThomas Weißschuh   Elf32_Half	e_shstrndx;
232*626fd352SThomas Weißschuh } Elf32_Ehdr;
233*626fd352SThomas Weißschuh 
234*626fd352SThomas Weißschuh typedef struct elf64_hdr {
235*626fd352SThomas Weißschuh   unsigned char	e_ident[EI_NIDENT];	/* ELF "magic number" */
236*626fd352SThomas Weißschuh   Elf64_Half e_type;
237*626fd352SThomas Weißschuh   Elf64_Half e_machine;
238*626fd352SThomas Weißschuh   Elf64_Word e_version;
239*626fd352SThomas Weißschuh   Elf64_Addr e_entry;		/* Entry point virtual address */
240*626fd352SThomas Weißschuh   Elf64_Off e_phoff;		/* Program header table file offset */
241*626fd352SThomas Weißschuh   Elf64_Off e_shoff;		/* Section header table file offset */
242*626fd352SThomas Weißschuh   Elf64_Word e_flags;
243*626fd352SThomas Weißschuh   Elf64_Half e_ehsize;
244*626fd352SThomas Weißschuh   Elf64_Half e_phentsize;
245*626fd352SThomas Weißschuh   Elf64_Half e_phnum;
246*626fd352SThomas Weißschuh   Elf64_Half e_shentsize;
247*626fd352SThomas Weißschuh   Elf64_Half e_shnum;
248*626fd352SThomas Weißschuh   Elf64_Half e_shstrndx;
249*626fd352SThomas Weißschuh } Elf64_Ehdr;
250*626fd352SThomas Weißschuh 
251*626fd352SThomas Weißschuh /* These constants define the permissions on sections in the program
252*626fd352SThomas Weißschuh    header, p_flags. */
253*626fd352SThomas Weißschuh #define PF_R		0x4
254*626fd352SThomas Weißschuh #define PF_W		0x2
255*626fd352SThomas Weißschuh #define PF_X		0x1
256*626fd352SThomas Weißschuh 
257*626fd352SThomas Weißschuh typedef struct elf32_phdr {
258*626fd352SThomas Weißschuh   Elf32_Word	p_type;
259*626fd352SThomas Weißschuh   Elf32_Off	p_offset;
260*626fd352SThomas Weißschuh   Elf32_Addr	p_vaddr;
261*626fd352SThomas Weißschuh   Elf32_Addr	p_paddr;
262*626fd352SThomas Weißschuh   Elf32_Word	p_filesz;
263*626fd352SThomas Weißschuh   Elf32_Word	p_memsz;
264*626fd352SThomas Weißschuh   Elf32_Word	p_flags;
265*626fd352SThomas Weißschuh   Elf32_Word	p_align;
266*626fd352SThomas Weißschuh } Elf32_Phdr;
267*626fd352SThomas Weißschuh 
268*626fd352SThomas Weißschuh typedef struct elf64_phdr {
269*626fd352SThomas Weißschuh   Elf64_Word p_type;
270*626fd352SThomas Weißschuh   Elf64_Word p_flags;
271*626fd352SThomas Weißschuh   Elf64_Off p_offset;		/* Segment file offset */
272*626fd352SThomas Weißschuh   Elf64_Addr p_vaddr;		/* Segment virtual address */
273*626fd352SThomas Weißschuh   Elf64_Addr p_paddr;		/* Segment physical address */
274*626fd352SThomas Weißschuh   Elf64_Xword p_filesz;		/* Segment size in file */
275*626fd352SThomas Weißschuh   Elf64_Xword p_memsz;		/* Segment size in memory */
276*626fd352SThomas Weißschuh   Elf64_Xword p_align;		/* Segment alignment, file & memory */
277*626fd352SThomas Weißschuh } Elf64_Phdr;
278*626fd352SThomas Weißschuh 
279*626fd352SThomas Weißschuh /* sh_type */
280*626fd352SThomas Weißschuh #define SHT_NULL	0
281*626fd352SThomas Weißschuh #define SHT_PROGBITS	1
282*626fd352SThomas Weißschuh #define SHT_SYMTAB	2
283*626fd352SThomas Weißschuh #define SHT_STRTAB	3
284*626fd352SThomas Weißschuh #define SHT_RELA	4
285*626fd352SThomas Weißschuh #define SHT_HASH	5
286*626fd352SThomas Weißschuh #define SHT_DYNAMIC	6
287*626fd352SThomas Weißschuh #define SHT_NOTE	7
288*626fd352SThomas Weißschuh #define SHT_NOBITS	8
289*626fd352SThomas Weißschuh #define SHT_REL		9
290*626fd352SThomas Weißschuh #define SHT_SHLIB	10
291*626fd352SThomas Weißschuh #define SHT_DYNSYM	11
292*626fd352SThomas Weißschuh #define SHT_NUM		12
293*626fd352SThomas Weißschuh #define SHT_LOPROC	0x70000000
294*626fd352SThomas Weißschuh #define SHT_HIPROC	0x7fffffff
295*626fd352SThomas Weißschuh #define SHT_LOUSER	0x80000000
296*626fd352SThomas Weißschuh #define SHT_HIUSER	0xffffffff
297*626fd352SThomas Weißschuh 
298*626fd352SThomas Weißschuh /* sh_flags */
299*626fd352SThomas Weißschuh #define SHF_WRITE		0x1
300*626fd352SThomas Weißschuh #define SHF_ALLOC		0x2
301*626fd352SThomas Weißschuh #define SHF_EXECINSTR		0x4
302*626fd352SThomas Weißschuh #define SHF_RELA_LIVEPATCH	0x00100000
303*626fd352SThomas Weißschuh #define SHF_RO_AFTER_INIT	0x00200000
304*626fd352SThomas Weißschuh #define SHF_MASKPROC		0xf0000000
305*626fd352SThomas Weißschuh 
306*626fd352SThomas Weißschuh /* special section indexes */
307*626fd352SThomas Weißschuh #define SHN_UNDEF	0
308*626fd352SThomas Weißschuh #define SHN_LORESERVE	0xff00
309*626fd352SThomas Weißschuh #define SHN_LOPROC	0xff00
310*626fd352SThomas Weißschuh #define SHN_HIPROC	0xff1f
311*626fd352SThomas Weißschuh #define SHN_LIVEPATCH	0xff20
312*626fd352SThomas Weißschuh #define SHN_ABS		0xfff1
313*626fd352SThomas Weißschuh #define SHN_COMMON	0xfff2
314*626fd352SThomas Weißschuh #define SHN_HIRESERVE	0xffff
315*626fd352SThomas Weißschuh 
316*626fd352SThomas Weißschuh typedef struct elf32_shdr {
317*626fd352SThomas Weißschuh   Elf32_Word	sh_name;
318*626fd352SThomas Weißschuh   Elf32_Word	sh_type;
319*626fd352SThomas Weißschuh   Elf32_Word	sh_flags;
320*626fd352SThomas Weißschuh   Elf32_Addr	sh_addr;
321*626fd352SThomas Weißschuh   Elf32_Off	sh_offset;
322*626fd352SThomas Weißschuh   Elf32_Word	sh_size;
323*626fd352SThomas Weißschuh   Elf32_Word	sh_link;
324*626fd352SThomas Weißschuh   Elf32_Word	sh_info;
325*626fd352SThomas Weißschuh   Elf32_Word	sh_addralign;
326*626fd352SThomas Weißschuh   Elf32_Word	sh_entsize;
327*626fd352SThomas Weißschuh } Elf32_Shdr;
328*626fd352SThomas Weißschuh 
329*626fd352SThomas Weißschuh typedef struct elf64_shdr {
330*626fd352SThomas Weißschuh   Elf64_Word sh_name;		/* Section name, index in string tbl */
331*626fd352SThomas Weißschuh   Elf64_Word sh_type;		/* Type of section */
332*626fd352SThomas Weißschuh   Elf64_Xword sh_flags;		/* Miscellaneous section attributes */
333*626fd352SThomas Weißschuh   Elf64_Addr sh_addr;		/* Section virtual addr at execution */
334*626fd352SThomas Weißschuh   Elf64_Off sh_offset;		/* Section file offset */
335*626fd352SThomas Weißschuh   Elf64_Xword sh_size;		/* Size of section in bytes */
336*626fd352SThomas Weißschuh   Elf64_Word sh_link;		/* Index of another section */
337*626fd352SThomas Weißschuh   Elf64_Word sh_info;		/* Additional section information */
338*626fd352SThomas Weißschuh   Elf64_Xword sh_addralign;	/* Section alignment */
339*626fd352SThomas Weißschuh   Elf64_Xword sh_entsize;	/* Entry size if section holds table */
340*626fd352SThomas Weißschuh } Elf64_Shdr;
341*626fd352SThomas Weißschuh 
342*626fd352SThomas Weißschuh #define	EI_MAG0		0		/* e_ident[] indexes */
343*626fd352SThomas Weißschuh #define	EI_MAG1		1
344*626fd352SThomas Weißschuh #define	EI_MAG2		2
345*626fd352SThomas Weißschuh #define	EI_MAG3		3
346*626fd352SThomas Weißschuh #define	EI_CLASS	4
347*626fd352SThomas Weißschuh #define	EI_DATA		5
348*626fd352SThomas Weißschuh #define	EI_VERSION	6
349*626fd352SThomas Weißschuh #define	EI_OSABI	7
350*626fd352SThomas Weißschuh #define	EI_PAD		8
351*626fd352SThomas Weißschuh 
352*626fd352SThomas Weißschuh #define	ELFMAG0		0x7f		/* EI_MAG */
353*626fd352SThomas Weißschuh #define	ELFMAG1		'E'
354*626fd352SThomas Weißschuh #define	ELFMAG2		'L'
355*626fd352SThomas Weißschuh #define	ELFMAG3		'F'
356*626fd352SThomas Weißschuh #define	ELFMAG		"\177ELF"
357*626fd352SThomas Weißschuh #define	SELFMAG		4
358*626fd352SThomas Weißschuh 
359*626fd352SThomas Weißschuh #define	ELFCLASSNONE	0		/* EI_CLASS */
360*626fd352SThomas Weißschuh #define	ELFCLASS32	1
361*626fd352SThomas Weißschuh #define	ELFCLASS64	2
362*626fd352SThomas Weißschuh #define	ELFCLASSNUM	3
363*626fd352SThomas Weißschuh 
364*626fd352SThomas Weißschuh #define ELFDATANONE	0		/* e_ident[EI_DATA] */
365*626fd352SThomas Weißschuh #define ELFDATA2LSB	1
366*626fd352SThomas Weißschuh #define ELFDATA2MSB	2
367*626fd352SThomas Weißschuh 
368*626fd352SThomas Weißschuh #define EV_NONE		0		/* e_version, EI_VERSION */
369*626fd352SThomas Weißschuh #define EV_CURRENT	1
370*626fd352SThomas Weißschuh #define EV_NUM		2
371*626fd352SThomas Weißschuh 
372*626fd352SThomas Weißschuh #define ELFOSABI_NONE	0
373*626fd352SThomas Weißschuh #define ELFOSABI_LINUX	3
374*626fd352SThomas Weißschuh 
375*626fd352SThomas Weißschuh #ifndef ELF_OSABI
376*626fd352SThomas Weißschuh #define ELF_OSABI ELFOSABI_NONE
377*626fd352SThomas Weißschuh #endif
378*626fd352SThomas Weißschuh 
379*626fd352SThomas Weißschuh /*
380*626fd352SThomas Weißschuh  * Notes used in ET_CORE. Architectures export some of the arch register sets
381*626fd352SThomas Weißschuh  * using the corresponding note types via the PTRACE_GETREGSET and
382*626fd352SThomas Weißschuh  * PTRACE_SETREGSET requests.
383*626fd352SThomas Weißschuh  * The note name for these types is "LINUX", except NT_PRFPREG that is named
384*626fd352SThomas Weißschuh  * "CORE".
385*626fd352SThomas Weißschuh  */
386*626fd352SThomas Weißschuh #define NT_PRSTATUS	1
387*626fd352SThomas Weißschuh #define NT_PRFPREG	2
388*626fd352SThomas Weißschuh #define NT_PRPSINFO	3
389*626fd352SThomas Weißschuh #define NT_TASKSTRUCT	4
390*626fd352SThomas Weißschuh #define NT_AUXV		6
391*626fd352SThomas Weißschuh /*
392*626fd352SThomas Weißschuh  * Note to userspace developers: size of NT_SIGINFO note may increase
393*626fd352SThomas Weißschuh  * in the future to accomodate more fields, don't assume it is fixed!
394*626fd352SThomas Weißschuh  */
395*626fd352SThomas Weißschuh #define NT_SIGINFO      0x53494749
396*626fd352SThomas Weißschuh #define NT_FILE		0x46494c45
397*626fd352SThomas Weißschuh #define NT_PRXFPREG     0x46e62b7f      /* copied from gdb5.1/include/elf/common.h */
398*626fd352SThomas Weißschuh #define NT_PPC_VMX	0x100		/* PowerPC Altivec/VMX registers */
399*626fd352SThomas Weißschuh #define NT_PPC_SPE	0x101		/* PowerPC SPE/EVR registers */
400*626fd352SThomas Weißschuh #define NT_PPC_VSX	0x102		/* PowerPC VSX registers */
401*626fd352SThomas Weißschuh #define NT_PPC_TAR	0x103		/* Target Address Register */
402*626fd352SThomas Weißschuh #define NT_PPC_PPR	0x104		/* Program Priority Register */
403*626fd352SThomas Weißschuh #define NT_PPC_DSCR	0x105		/* Data Stream Control Register */
404*626fd352SThomas Weißschuh #define NT_PPC_EBB	0x106		/* Event Based Branch Registers */
405*626fd352SThomas Weißschuh #define NT_PPC_PMU	0x107		/* Performance Monitor Registers */
406*626fd352SThomas Weißschuh #define NT_PPC_TM_CGPR	0x108		/* TM checkpointed GPR Registers */
407*626fd352SThomas Weißschuh #define NT_PPC_TM_CFPR	0x109		/* TM checkpointed FPR Registers */
408*626fd352SThomas Weißschuh #define NT_PPC_TM_CVMX	0x10a		/* TM checkpointed VMX Registers */
409*626fd352SThomas Weißschuh #define NT_PPC_TM_CVSX	0x10b		/* TM checkpointed VSX Registers */
410*626fd352SThomas Weißschuh #define NT_PPC_TM_SPR	0x10c		/* TM Special Purpose Registers */
411*626fd352SThomas Weißschuh #define NT_PPC_TM_CTAR	0x10d		/* TM checkpointed Target Address Register */
412*626fd352SThomas Weißschuh #define NT_PPC_TM_CPPR	0x10e		/* TM checkpointed Program Priority Register */
413*626fd352SThomas Weißschuh #define NT_PPC_TM_CDSCR	0x10f		/* TM checkpointed Data Stream Control Register */
414*626fd352SThomas Weißschuh #define NT_PPC_PKEY	0x110		/* Memory Protection Keys registers */
415*626fd352SThomas Weißschuh #define NT_PPC_DEXCR	0x111		/* PowerPC DEXCR registers */
416*626fd352SThomas Weißschuh #define NT_PPC_HASHKEYR	0x112		/* PowerPC HASHKEYR register */
417*626fd352SThomas Weißschuh #define NT_386_TLS	0x200		/* i386 TLS slots (struct user_desc) */
418*626fd352SThomas Weißschuh #define NT_386_IOPERM	0x201		/* x86 io permission bitmap (1=deny) */
419*626fd352SThomas Weißschuh #define NT_X86_XSTATE	0x202		/* x86 extended state using xsave */
420*626fd352SThomas Weißschuh /* Old binutils treats 0x203 as a CET state */
421*626fd352SThomas Weißschuh #define NT_X86_SHSTK	0x204		/* x86 SHSTK state */
422*626fd352SThomas Weißschuh #define NT_X86_XSAVE_LAYOUT	0x205	/* XSAVE layout description */
423*626fd352SThomas Weißschuh #define NT_S390_HIGH_GPRS	0x300	/* s390 upper register halves */
424*626fd352SThomas Weißschuh #define NT_S390_TIMER	0x301		/* s390 timer register */
425*626fd352SThomas Weißschuh #define NT_S390_TODCMP	0x302		/* s390 TOD clock comparator register */
426*626fd352SThomas Weißschuh #define NT_S390_TODPREG	0x303		/* s390 TOD programmable register */
427*626fd352SThomas Weißschuh #define NT_S390_CTRS	0x304		/* s390 control registers */
428*626fd352SThomas Weißschuh #define NT_S390_PREFIX	0x305		/* s390 prefix register */
429*626fd352SThomas Weißschuh #define NT_S390_LAST_BREAK	0x306	/* s390 breaking event address */
430*626fd352SThomas Weißschuh #define NT_S390_SYSTEM_CALL	0x307	/* s390 system call restart data */
431*626fd352SThomas Weißschuh #define NT_S390_TDB	0x308		/* s390 transaction diagnostic block */
432*626fd352SThomas Weißschuh #define NT_S390_VXRS_LOW	0x309	/* s390 vector registers 0-15 upper half */
433*626fd352SThomas Weißschuh #define NT_S390_VXRS_HIGH	0x30a	/* s390 vector registers 16-31 */
434*626fd352SThomas Weißschuh #define NT_S390_GS_CB	0x30b		/* s390 guarded storage registers */
435*626fd352SThomas Weißschuh #define NT_S390_GS_BC	0x30c		/* s390 guarded storage broadcast control block */
436*626fd352SThomas Weißschuh #define NT_S390_RI_CB	0x30d		/* s390 runtime instrumentation */
437*626fd352SThomas Weißschuh #define NT_S390_PV_CPU_DATA	0x30e	/* s390 protvirt cpu dump data */
438*626fd352SThomas Weißschuh #define NT_ARM_VFP	0x400		/* ARM VFP/NEON registers */
439*626fd352SThomas Weißschuh #define NT_ARM_TLS	0x401		/* ARM TLS register */
440*626fd352SThomas Weißschuh #define NT_ARM_HW_BREAK	0x402		/* ARM hardware breakpoint registers */
441*626fd352SThomas Weißschuh #define NT_ARM_HW_WATCH	0x403		/* ARM hardware watchpoint registers */
442*626fd352SThomas Weißschuh #define NT_ARM_SYSTEM_CALL	0x404	/* ARM system call number */
443*626fd352SThomas Weißschuh #define NT_ARM_SVE	0x405		/* ARM Scalable Vector Extension registers */
444*626fd352SThomas Weißschuh #define NT_ARM_PAC_MASK		0x406	/* ARM pointer authentication code masks */
445*626fd352SThomas Weißschuh #define NT_ARM_PACA_KEYS	0x407	/* ARM pointer authentication address keys */
446*626fd352SThomas Weißschuh #define NT_ARM_PACG_KEYS	0x408	/* ARM pointer authentication generic key */
447*626fd352SThomas Weißschuh #define NT_ARM_TAGGED_ADDR_CTRL	0x409	/* arm64 tagged address control (prctl()) */
448*626fd352SThomas Weißschuh #define NT_ARM_PAC_ENABLED_KEYS	0x40a	/* arm64 ptr auth enabled keys (prctl()) */
449*626fd352SThomas Weißschuh #define NT_ARM_SSVE	0x40b		/* ARM Streaming SVE registers */
450*626fd352SThomas Weißschuh #define NT_ARM_ZA	0x40c		/* ARM SME ZA registers */
451*626fd352SThomas Weißschuh #define NT_ARM_ZT	0x40d		/* ARM SME ZT registers */
452*626fd352SThomas Weißschuh #define NT_ARM_FPMR	0x40e		/* ARM floating point mode register */
453*626fd352SThomas Weißschuh #define NT_ARM_POE	0x40f		/* ARM POE registers */
454*626fd352SThomas Weißschuh #define NT_ARM_GCS	0x410		/* ARM GCS state */
455*626fd352SThomas Weißschuh #define NT_ARC_V2	0x600		/* ARCv2 accumulator/extra registers */
456*626fd352SThomas Weißschuh #define NT_VMCOREDD	0x700		/* Vmcore Device Dump Note */
457*626fd352SThomas Weißschuh #define NT_MIPS_DSP	0x800		/* MIPS DSP ASE registers */
458*626fd352SThomas Weißschuh #define NT_MIPS_FP_MODE	0x801		/* MIPS floating-point mode */
459*626fd352SThomas Weißschuh #define NT_MIPS_MSA	0x802		/* MIPS SIMD registers */
460*626fd352SThomas Weißschuh #define NT_RISCV_CSR	0x900		/* RISC-V Control and Status Registers */
461*626fd352SThomas Weißschuh #define NT_RISCV_VECTOR	0x901		/* RISC-V vector registers */
462*626fd352SThomas Weißschuh #define NT_RISCV_TAGGED_ADDR_CTRL 0x902	/* RISC-V tagged address control (prctl()) */
463*626fd352SThomas Weißschuh #define NT_LOONGARCH_CPUCFG	0xa00	/* LoongArch CPU config registers */
464*626fd352SThomas Weißschuh #define NT_LOONGARCH_CSR	0xa01	/* LoongArch control and status registers */
465*626fd352SThomas Weißschuh #define NT_LOONGARCH_LSX	0xa02	/* LoongArch Loongson SIMD Extension registers */
466*626fd352SThomas Weißschuh #define NT_LOONGARCH_LASX	0xa03	/* LoongArch Loongson Advanced SIMD Extension registers */
467*626fd352SThomas Weißschuh #define NT_LOONGARCH_LBT	0xa04	/* LoongArch Loongson Binary Translation registers */
468*626fd352SThomas Weißschuh #define NT_LOONGARCH_HW_BREAK	0xa05   /* LoongArch hardware breakpoint registers */
469*626fd352SThomas Weißschuh #define NT_LOONGARCH_HW_WATCH	0xa06   /* LoongArch hardware watchpoint registers */
470*626fd352SThomas Weißschuh 
471*626fd352SThomas Weißschuh /* Note types with note name "GNU" */
472*626fd352SThomas Weißschuh #define NT_GNU_PROPERTY_TYPE_0	5
473*626fd352SThomas Weißschuh 
474*626fd352SThomas Weißschuh /* Note header in a PT_NOTE section */
475*626fd352SThomas Weißschuh typedef struct elf32_note {
476*626fd352SThomas Weißschuh   Elf32_Word	n_namesz;	/* Name size */
477*626fd352SThomas Weißschuh   Elf32_Word	n_descsz;	/* Content size */
478*626fd352SThomas Weißschuh   Elf32_Word	n_type;		/* Content type */
479*626fd352SThomas Weißschuh } Elf32_Nhdr;
480*626fd352SThomas Weißschuh 
481*626fd352SThomas Weißschuh /* Note header in a PT_NOTE section */
482*626fd352SThomas Weißschuh typedef struct elf64_note {
483*626fd352SThomas Weißschuh   Elf64_Word n_namesz;	/* Name size */
484*626fd352SThomas Weißschuh   Elf64_Word n_descsz;	/* Content size */
485*626fd352SThomas Weißschuh   Elf64_Word n_type;	/* Content type */
486*626fd352SThomas Weißschuh } Elf64_Nhdr;
487*626fd352SThomas Weißschuh 
488*626fd352SThomas Weißschuh /* .note.gnu.property types for EM_AARCH64: */
489*626fd352SThomas Weißschuh #define GNU_PROPERTY_AARCH64_FEATURE_1_AND	0xc0000000
490*626fd352SThomas Weißschuh 
491*626fd352SThomas Weißschuh /* Bits for GNU_PROPERTY_AARCH64_FEATURE_1_BTI */
492*626fd352SThomas Weißschuh #define GNU_PROPERTY_AARCH64_FEATURE_1_BTI	(1U << 0)
493*626fd352SThomas Weißschuh 
494*626fd352SThomas Weißschuh typedef struct {
495*626fd352SThomas Weißschuh   Elf32_Half	vd_version;
496*626fd352SThomas Weißschuh   Elf32_Half	vd_flags;
497*626fd352SThomas Weißschuh   Elf32_Half	vd_ndx;
498*626fd352SThomas Weißschuh   Elf32_Half	vd_cnt;
499*626fd352SThomas Weißschuh   Elf32_Word	vd_hash;
500*626fd352SThomas Weißschuh   Elf32_Word	vd_aux;
501*626fd352SThomas Weißschuh   Elf32_Word	vd_next;
502*626fd352SThomas Weißschuh } Elf32_Verdef;
503*626fd352SThomas Weißschuh 
504*626fd352SThomas Weißschuh typedef struct {
505*626fd352SThomas Weißschuh   Elf64_Half	vd_version;
506*626fd352SThomas Weißschuh   Elf64_Half	vd_flags;
507*626fd352SThomas Weißschuh   Elf64_Half	vd_ndx;
508*626fd352SThomas Weißschuh   Elf64_Half	vd_cnt;
509*626fd352SThomas Weißschuh   Elf64_Word	vd_hash;
510*626fd352SThomas Weißschuh   Elf64_Word	vd_aux;
511*626fd352SThomas Weißschuh   Elf64_Word	vd_next;
512*626fd352SThomas Weißschuh } Elf64_Verdef;
513*626fd352SThomas Weißschuh 
514*626fd352SThomas Weißschuh typedef struct {
515*626fd352SThomas Weißschuh   Elf32_Word    vda_name;
516*626fd352SThomas Weißschuh   Elf32_Word    vda_next;
517*626fd352SThomas Weißschuh } Elf32_Verdaux;
518*626fd352SThomas Weißschuh 
519*626fd352SThomas Weißschuh typedef struct {
520*626fd352SThomas Weißschuh   Elf64_Word    vda_name;
521*626fd352SThomas Weißschuh   Elf64_Word    vda_next;
522*626fd352SThomas Weißschuh } Elf64_Verdaux;
523*626fd352SThomas Weißschuh 
524*626fd352SThomas Weißschuh #endif /* _LINUX_ELF_H */
525