Commit 382e67ae authored by Nicolas Pitre's avatar Nicolas Pitre

ARM: enable elf_fdpic on systems with an MMU

Provide the necessary changes to be able to execute ELF-FDPIC binaries
on ARM systems with an MMU.

The default for CONFIG_BINFMT_ELF_FDPIC is also set to n if the regular
ELF loader is already configured so not to force FDPIC support on
everyone. Given that CONFIG_BINFMT_ELF depends on CONFIG_MMU, this means
CONFIG_BINFMT_ELF_FDPIC will still default to y when !MMU.
Signed-off-by: default avatarNicolas Pitre <nico@linaro.org>
Acked-by: default avatarMickael GUENE <mickael.guene@st.com>
Tested-by: default avatarVincent Abriou <vincent.abriou@st.com>
Tested-by: default avatarAndras Szemzo <szemzo.andras@gmail.com>
parent 50b2b2e6
...@@ -14,6 +14,10 @@ typedef struct { ...@@ -14,6 +14,10 @@ typedef struct {
#ifdef CONFIG_VDSO #ifdef CONFIG_VDSO
unsigned long vdso; unsigned long vdso;
#endif #endif
#ifdef CONFIG_BINFMT_ELF_FDPIC
unsigned long exec_fdpic_loadmap;
unsigned long interp_fdpic_loadmap;
#endif
} mm_context_t; } mm_context_t;
#ifdef CONFIG_CPU_HAS_ASID #ifdef CONFIG_CPU_HAS_ASID
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#include <linux/personality.h> #include <linux/personality.h>
#include <linux/binfmts.h> #include <linux/binfmts.h>
#include <linux/elf.h> #include <linux/elf.h>
#include <linux/elf-fdpic.h>
#include <asm/system_info.h> #include <asm/system_info.h>
int elf_check_arch(const struct elf32_hdr *x) int elf_check_arch(const struct elf32_hdr *x)
...@@ -89,3 +90,24 @@ int arm_elf_read_implies_exec(int executable_stack) ...@@ -89,3 +90,24 @@ int arm_elf_read_implies_exec(int executable_stack)
return 0; return 0;
} }
EXPORT_SYMBOL(arm_elf_read_implies_exec); EXPORT_SYMBOL(arm_elf_read_implies_exec);
#if defined(CONFIG_MMU) && defined(CONFIG_BINFMT_ELF_FDPIC)
void elf_fdpic_arch_lay_out_mm(struct elf_fdpic_params *exec_params,
struct elf_fdpic_params *interp_params,
unsigned long *start_stack,
unsigned long *start_brk)
{
elf_set_personality(&exec_params->hdr);
exec_params->load_addr = 0x8000;
interp_params->load_addr = ELF_ET_DYN_BASE;
*start_stack = TASK_SIZE - SZ_16M;
if ((exec_params->flags & ELF_FDPIC_FLAG_ARRANGEMENT) == ELF_FDPIC_FLAG_INDEPENDENT) {
exec_params->flags &= ~ELF_FDPIC_FLAG_ARRANGEMENT;
exec_params->flags |= ELF_FDPIC_FLAG_CONSTDISP;
}
}
#endif
...@@ -34,8 +34,8 @@ config ARCH_BINFMT_ELF_STATE ...@@ -34,8 +34,8 @@ config ARCH_BINFMT_ELF_STATE
config BINFMT_ELF_FDPIC config BINFMT_ELF_FDPIC
bool "Kernel support for FDPIC ELF binaries" bool "Kernel support for FDPIC ELF binaries"
default y default y if !BINFMT_ELF
depends on ((ARM && !MMU) || FRV || BLACKFIN || (SUPERH32 && !MMU) || C6X) depends on (ARM || FRV || BLACKFIN || (SUPERH32 && !MMU) || C6X)
select ELFCORE select ELFCORE
help help
ELF FDPIC binaries are based on ELF, but allow the individual load ELF FDPIC binaries are based on ELF, but allow the individual load
......
...@@ -377,6 +377,11 @@ static int load_elf_fdpic_binary(struct linux_binprm *bprm) ...@@ -377,6 +377,11 @@ static int load_elf_fdpic_binary(struct linux_binprm *bprm)
executable_stack); executable_stack);
if (retval < 0) if (retval < 0)
goto error; goto error;
#ifdef ARCH_HAS_SETUP_ADDITIONAL_PAGES
retval = arch_setup_additional_pages(bprm, !!interpreter_name);
if (retval < 0)
goto error;
#endif
#endif #endif
/* load the executable and interpreter into memory */ /* load the executable and interpreter into memory */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment