xref: /linux/include/linux/elf.h (revision 621cde16e49b3ecf7d59a8106a20aaebfb4a59a9)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds #ifndef _LINUX_ELF_H
31da177e4SLinus Torvalds #define _LINUX_ELF_H
41da177e4SLinus Torvalds 
5db751e30SDave Martin #include <linux/types.h>
61da177e4SLinus Torvalds #include <asm/elf.h>
7607ca46eSDavid Howells #include <uapi/linux/elf.h>
81da177e4SLinus Torvalds 
9267aed9dSDavid Howells #ifndef elf_read_implies_exec
10267aed9dSDavid Howells   /* Executables for which elf_read_implies_exec() returns TRUE will
11267aed9dSDavid Howells      have the READ_IMPLIES_EXEC personality flag set automatically.
12267aed9dSDavid Howells      Override in asm/elf.h as needed.  */
13267aed9dSDavid Howells # define elf_read_implies_exec(ex, have_pt_gnu_stack)	0
14267aed9dSDavid Howells #endif
15e72837e3SAl Viro #ifndef SET_PERSONALITY
16e72837e3SAl Viro #define SET_PERSONALITY(ex) \
17e72837e3SAl Viro 	set_personality(PER_LINUX | (current->personality & (~PER_MASK)))
18e72837e3SAl Viro #endif
19267aed9dSDavid Howells 
20774c105eSPaul Burton #ifndef SET_PERSONALITY2
21774c105eSPaul Burton #define SET_PERSONALITY2(ex, state) \
22774c105eSPaul Burton 	SET_PERSONALITY(ex)
23774c105eSPaul Burton #endif
24774c105eSPaul Burton 
25bc3d7bf6SGabriel Krisman Bertazi #ifndef START_THREAD
26bc3d7bf6SGabriel Krisman Bertazi #define START_THREAD(elf_ex, regs, elf_entry, start_stack)	\
27bc3d7bf6SGabriel Krisman Bertazi 	start_thread(regs, elf_entry, start_stack)
28bc3d7bf6SGabriel Krisman Bertazi #endif
29bc3d7bf6SGabriel Krisman Bertazi 
309a29a671SGabriel Krisman Bertazi #if defined(ARCH_HAS_SETUP_ADDITIONAL_PAGES) && !defined(ARCH_SETUP_ADDITIONAL_PAGES)
319a29a671SGabriel Krisman Bertazi #define ARCH_SETUP_ADDITIONAL_PAGES(bprm, ex, interpreter) \
329a29a671SGabriel Krisman Bertazi 	arch_setup_additional_pages(bprm, interpreter)
339a29a671SGabriel Krisman Bertazi #endif
349a29a671SGabriel Krisman Bertazi 
3500e19ceeSDave Martin #define ELF32_GNU_PROPERTY_ALIGN	4
3600e19ceeSDave Martin #define ELF64_GNU_PROPERTY_ALIGN	8
3700e19ceeSDave Martin 
381da177e4SLinus Torvalds #if ELF_CLASS == ELFCLASS32
391da177e4SLinus Torvalds 
401da177e4SLinus Torvalds extern Elf32_Dyn _DYNAMIC [];
411da177e4SLinus Torvalds #define elfhdr		elf32_hdr
421da177e4SLinus Torvalds #define elf_phdr	elf32_phdr
438d9032bbSDaisuke HATAYAMA #define elf_shdr	elf32_shdr
441da177e4SLinus Torvalds #define elf_note	elf32_note
45386d9a7eSMagnus Damm #define elf_addr_t	Elf32_Off
461fcccbacSDaisuke HATAYAMA #define Elf_Half	Elf32_Half
4751dbd925SHari Bathini #define Elf_Word	Elf32_Word
4800e19ceeSDave Martin #define ELF_GNU_PROPERTY_ALIGN	ELF32_GNU_PROPERTY_ALIGN
491da177e4SLinus Torvalds 
501da177e4SLinus Torvalds #else
511da177e4SLinus Torvalds 
521da177e4SLinus Torvalds extern Elf64_Dyn _DYNAMIC [];
531da177e4SLinus Torvalds #define elfhdr		elf64_hdr
541da177e4SLinus Torvalds #define elf_phdr	elf64_phdr
558d9032bbSDaisuke HATAYAMA #define elf_shdr	elf64_shdr
561da177e4SLinus Torvalds #define elf_note	elf64_note
57386d9a7eSMagnus Damm #define elf_addr_t	Elf64_Off
581fcccbacSDaisuke HATAYAMA #define Elf_Half	Elf64_Half
5951dbd925SHari Bathini #define Elf_Word	Elf64_Word
6000e19ceeSDave Martin #define ELF_GNU_PROPERTY_ALIGN	ELF64_GNU_PROPERTY_ALIGN
611da177e4SLinus Torvalds 
621da177e4SLinus Torvalds #endif
631da177e4SLinus Torvalds 
64e5501492SMichael Ellerman /* Optional callbacks to write extra ELF notes. */
65267aed9dSDavid Howells struct file;
66cdc3d562SAl Viro struct coredump_params;
67267aed9dSDavid Howells 
68*a9c3475dSVignesh Balasubramanian #ifndef CONFIG_ARCH_HAVE_EXTRA_ELF_NOTES
elf_coredump_extra_notes_size(void)69e5501492SMichael Ellerman static inline int elf_coredump_extra_notes_size(void) { return 0; }
elf_coredump_extra_notes_write(struct coredump_params * cprm)70cdc3d562SAl Viro static inline int elf_coredump_extra_notes_write(struct coredump_params *cprm) { return 0; }
71e5501492SMichael Ellerman #else
72e5501492SMichael Ellerman extern int elf_coredump_extra_notes_size(void);
73cdc3d562SAl Viro extern int elf_coredump_extra_notes_write(struct coredump_params *cprm);
74e5501492SMichael Ellerman #endif
75db751e30SDave Martin 
76db751e30SDave Martin /*
77db751e30SDave Martin  * NT_GNU_PROPERTY_TYPE_0 header:
78db751e30SDave Martin  * Keep this internal until/unless there is an agreed UAPI definition.
79db751e30SDave Martin  * pr_type values (GNU_PROPERTY_*) are public and defined in the UAPI header.
80db751e30SDave Martin  */
81db751e30SDave Martin struct gnu_property {
82db751e30SDave Martin 	u32 pr_type;
83db751e30SDave Martin 	u32 pr_datasz;
84db751e30SDave Martin };
85db751e30SDave Martin 
8600e19ceeSDave Martin struct arch_elf_state;
8700e19ceeSDave Martin 
8800e19ceeSDave Martin #ifndef CONFIG_ARCH_USE_GNU_PROPERTY
arch_parse_elf_property(u32 type,const void * data,size_t datasz,bool compat,struct arch_elf_state * arch)8900e19ceeSDave Martin static inline int arch_parse_elf_property(u32 type, const void *data,
9000e19ceeSDave Martin 					  size_t datasz, bool compat,
9100e19ceeSDave Martin 					  struct arch_elf_state *arch)
9200e19ceeSDave Martin {
9300e19ceeSDave Martin 	return 0;
9400e19ceeSDave Martin }
9500e19ceeSDave Martin #else
9600e19ceeSDave Martin extern int arch_parse_elf_property(u32 type, const void *data, size_t datasz,
9700e19ceeSDave Martin 				   bool compat, struct arch_elf_state *arch);
9800e19ceeSDave Martin #endif
9900e19ceeSDave Martin 
100fe0f6766SDave Martin #ifdef CONFIG_ARCH_HAVE_ELF_PROT
101fe0f6766SDave Martin int arch_elf_adjust_prot(int prot, const struct arch_elf_state *state,
102fe0f6766SDave Martin 			 bool has_interp, bool is_interp);
103fe0f6766SDave Martin #else
arch_elf_adjust_prot(int prot,const struct arch_elf_state * state,bool has_interp,bool is_interp)104fe0f6766SDave Martin static inline int arch_elf_adjust_prot(int prot,
105fe0f6766SDave Martin 				       const struct arch_elf_state *state,
106fe0f6766SDave Martin 				       bool has_interp, bool is_interp)
107fe0f6766SDave Martin {
108fe0f6766SDave Martin 	return prot;
109fe0f6766SDave Martin }
110fe0f6766SDave Martin #endif
111fe0f6766SDave Martin 
1121da177e4SLinus Torvalds #endif /* _LINUX_ELF_H */
113