[v2,5/8] ARM: add ELF_FDPIC support

Vincent ABRIOU vincent.abriou at st.com
Mon Aug 28 07:07:46 PDT 2017


Hi Nicolas

On 08/17/2017 09:23 AM, Nicolas Pitre wrote:
> This includes the necessary code to recognise the FDPIC format on ARM
> and the ptrace command definitions used by the common ptrace code.
> 
> Based on patches originally from Mickael Guene <mickael.guene at st.com>.
> 
> Signed-off-by: Nicolas Pitre <nico at linaro.org>
Tested-by: Vincent Abriou <vincent.abriou at st.com>

BR
Vincent

> ---
>   arch/arm/include/asm/elf.h         | 12 ++++++++++++
>   arch/arm/include/asm/mmu.h         |  4 ++++
>   arch/arm/include/uapi/asm/ptrace.h |  4 ++++
>   fs/Kconfig.binfmt                  |  2 +-
>   4 files changed, 21 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/arm/include/asm/elf.h b/arch/arm/include/asm/elf.h
> index e2786acf82..ad0ca4f2ba 100644
> --- a/arch/arm/include/asm/elf.h
> +++ b/arch/arm/include/asm/elf.h
> @@ -100,6 +100,11 @@ struct elf32_hdr;
>   extern int elf_check_arch(const struct elf32_hdr *);
>   #define elf_check_arch elf_check_arch
>   
> +#define ELFOSABI_ARM_FDPIC  65	/* ARM FDPIC platform */
> +#define elf_check_fdpic(x)  ((x)->e_ident[EI_OSABI] == ELFOSABI_ARM_FDPIC)
> +#define elf_check_const_displacement(x)  ((x)->e_flags & EF_ARM_PIC)
> +#define ELF_FDPIC_CORE_EFLAGS  0
> +
>   #define vmcore_elf64_check_arch(x) (0)
>   
>   extern int arm_elf_read_implies_exec(int);
> @@ -120,6 +125,13 @@ int dump_task_regs(struct task_struct *t, elf_gregset_t *elfregs);
>      have no such handler.  */
>   #define ELF_PLAT_INIT(_r, load_addr)	(_r)->ARM_r0 = 0
>   
> +#define ELF_FDPIC_PLAT_INIT(_r, _exec_map_addr, _interp_map_addr, dynamic_addr) \
> +	do { \
> +		(_r)->ARM_r7 = _exec_map_addr; \
> +		(_r)->ARM_r8 = _interp_map_addr; \
> +		(_r)->ARM_r9 = dynamic_addr; \
> +	} while(0)
> +
>   extern void elf_set_personality(const struct elf32_hdr *);
>   #define SET_PERSONALITY(ex)	elf_set_personality(&(ex))
>   
> diff --git a/arch/arm/include/asm/mmu.h b/arch/arm/include/asm/mmu.h
> index a5b4742105..e0eb16680a 100644
> --- a/arch/arm/include/asm/mmu.h
> +++ b/arch/arm/include/asm/mmu.h
> @@ -33,6 +33,10 @@ typedef struct {
>    */
>   typedef struct {
>   	unsigned long	end_brk;
> +#ifdef CONFIG_BINFMT_ELF_FDPIC
> +	unsigned long	exec_fdpic_loadmap;
> +	unsigned long	interp_fdpic_loadmap;
> +#endif
>   } mm_context_t;
>   
>   #endif
> diff --git a/arch/arm/include/uapi/asm/ptrace.h b/arch/arm/include/uapi/asm/ptrace.h
> index 5af0ed1b82..3173eb9751 100644
> --- a/arch/arm/include/uapi/asm/ptrace.h
> +++ b/arch/arm/include/uapi/asm/ptrace.h
> @@ -31,6 +31,10 @@
>   #define PTRACE_SETVFPREGS	28
>   #define PTRACE_GETHBPREGS	29
>   #define PTRACE_SETHBPREGS	30
> +#define PTRACE_GETFDPIC		31
> +
> +#define PTRACE_GETFDPIC_EXEC	0
> +#define PTRACE_GETFDPIC_INTERP	1
>   
>   /*
>    * PSR bits
> diff --git a/fs/Kconfig.binfmt b/fs/Kconfig.binfmt
> index b2f82cf6bf..6ef70ce8e9 100644
> --- a/fs/Kconfig.binfmt
> +++ b/fs/Kconfig.binfmt
> @@ -35,7 +35,7 @@ config ARCH_BINFMT_ELF_STATE
>   config BINFMT_ELF_FDPIC
>   	bool "Kernel support for FDPIC ELF binaries"
>   	default y
> -	depends on (FRV || BLACKFIN || (SUPERH32 && !MMU) || C6X)
> +	depends on ((ARM && !MMU) || FRV || BLACKFIN || (SUPERH32 && !MMU) || C6X)
>   	select ELFCORE
>   	help
>   	  ELF FDPIC binaries are based on ELF, but allow the individual load
> 


More information about the linux-arm-kernel mailing list