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