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