diff mbox series

[v5,02/13] x86/um: nommu: elf loader for fdpic

Message ID d387e58f08b929357a2651e82d2ee18bcf681e40.1733998168.git.thehajime@gmail.com (mailing list archive)
State New
Headers show
Series None | expand

Commit Message

Hajime Tazaki Dec. 12, 2024, 10:12 a.m. UTC
As UML supports CONFIG_MMU=n case, it has to use an alternate ELF
loader, FDPIC ELF loader.  In this commit, we added necessary
definitions in the arch, as UML has not been used so far.  It also
updates Kconfig file to use BINFMT_ELF_FDPIC under !MMU environment.

Cc: Eric Biederman <ebiederm@xmission.com>
Cc: Kees Cook <kees@kernel.org>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
Cc: Christian Brauner <brauner@kernel.org>
Cc: Jan Kara <jack@suse.cz>
Cc: linux-mm@kvack.org
Cc: linux-fsdevel@vger.kernel.org
Signed-off-by: Hajime Tazaki <thehajime@gmail.com>
Signed-off-by: Ricardo Koller <ricarkol@google.com>
---
 arch/um/include/asm/mmu.h            | 5 +++++
 arch/um/include/asm/ptrace-generic.h | 6 ++++++
 arch/x86/um/asm/elf.h                | 8 ++++++--
 fs/Kconfig.binfmt                    | 2 +-
 4 files changed, 18 insertions(+), 3 deletions(-)

Comments

Eric W. Biederman Dec. 12, 2024, 2:22 p.m. UTC | #1
Hajime Tazaki <thehajime@gmail.com> writes:

> As UML supports CONFIG_MMU=n case, it has to use an alternate ELF
> loader, FDPIC ELF loader.  In this commit, we added necessary
> definitions in the arch, as UML has not been used so far.  It also
> updates Kconfig file to use BINFMT_ELF_FDPIC under !MMU environment.

Why does the no mmu case need an alternative elf loader?

Last time I looked the regular binfmt_elf works just fine
without an mmu.  I looked again and at a quick skim the
regular elf loader still looks like it will work without
an MMU.

You would need ET_DYN binaries just so they will load and run
in a position independent way.  But even that seems a common
configuration even with a MMU these days.

There are some funny things in elf_fdpic where it departs
from the ELF standard and is no fun to support unless it
is necessary.  So I am not excited to see more architectures
supporting ELF_FDPIC.

Eric



> Cc: Eric Biederman <ebiederm@xmission.com>
> Cc: Kees Cook <kees@kernel.org>
> Cc: Alexander Viro <viro@zeniv.linux.org.uk>
> Cc: Christian Brauner <brauner@kernel.org>
> Cc: Jan Kara <jack@suse.cz>
> Cc: linux-mm@kvack.org
> Cc: linux-fsdevel@vger.kernel.org
> Signed-off-by: Hajime Tazaki <thehajime@gmail.com>
> Signed-off-by: Ricardo Koller <ricarkol@google.com>
> ---
>  arch/um/include/asm/mmu.h            | 5 +++++
>  arch/um/include/asm/ptrace-generic.h | 6 ++++++
>  arch/x86/um/asm/elf.h                | 8 ++++++--
>  fs/Kconfig.binfmt                    | 2 +-
>  4 files changed, 18 insertions(+), 3 deletions(-)
>
> diff --git a/arch/um/include/asm/mmu.h b/arch/um/include/asm/mmu.h
> index a3eaca41ff61..01422b761aa0 100644
> --- a/arch/um/include/asm/mmu.h
> +++ b/arch/um/include/asm/mmu.h
> @@ -14,6 +14,11 @@ typedef struct mm_context {
>  	/* Address range in need of a TLB sync */
>  	unsigned long sync_tlb_range_from;
>  	unsigned long sync_tlb_range_to;
> +
> +#ifdef CONFIG_BINFMT_ELF_FDPIC
> +	unsigned long   exec_fdpic_loadmap;
> +	unsigned long   interp_fdpic_loadmap;
> +#endif
>  } mm_context_t;
>  
>  #endif
> diff --git a/arch/um/include/asm/ptrace-generic.h b/arch/um/include/asm/ptrace-generic.h
> index 4696f24d1492..4ff844bcb1cd 100644
> --- a/arch/um/include/asm/ptrace-generic.h
> +++ b/arch/um/include/asm/ptrace-generic.h
> @@ -29,6 +29,12 @@ struct pt_regs {
>  
>  #define PTRACE_OLDSETOPTIONS 21
>  
> +#ifdef CONFIG_BINFMT_ELF_FDPIC
> +#define PTRACE_GETFDPIC		31
> +#define PTRACE_GETFDPIC_EXEC	0
> +#define PTRACE_GETFDPIC_INTERP	1
> +#endif
> +
>  struct task_struct;
>  
>  extern long subarch_ptrace(struct task_struct *child, long request,
> diff --git a/arch/x86/um/asm/elf.h b/arch/x86/um/asm/elf.h
> index 62ed5d68a978..33f69f1eac10 100644
> --- a/arch/x86/um/asm/elf.h
> +++ b/arch/x86/um/asm/elf.h
> @@ -9,6 +9,7 @@
>  #include <skas.h>
>  
>  #define CORE_DUMP_USE_REGSET
> +#define ELF_FDPIC_CORE_EFLAGS  0
>  
>  #ifdef CONFIG_X86_32
>  
> @@ -190,8 +191,11 @@ extern int arch_setup_additional_pages(struct linux_binprm *bprm,
>  
>  extern unsigned long um_vdso_addr;
>  #define AT_SYSINFO_EHDR 33
> -#define ARCH_DLINFO	NEW_AUX_ENT(AT_SYSINFO_EHDR, um_vdso_addr)
> -
> +#define ARCH_DLINFO						\
> +do {								\
> +	NEW_AUX_ENT(AT_SYSINFO_EHDR, um_vdso_addr);		\
> +	NEW_AUX_ENT(AT_MINSIGSTKSZ, 0);			\
> +} while (0)
>  #endif
>  
>  typedef unsigned long elf_greg_t;
> diff --git a/fs/Kconfig.binfmt b/fs/Kconfig.binfmt
> index bd2f530e5740..419ba0282806 100644
> --- a/fs/Kconfig.binfmt
> +++ b/fs/Kconfig.binfmt
> @@ -58,7 +58,7 @@ config ARCH_USE_GNU_PROPERTY
>  config BINFMT_ELF_FDPIC
>  	bool "Kernel support for FDPIC ELF binaries"
>  	default y if !BINFMT_ELF
> -	depends on ARM || ((M68K || RISCV || SUPERH || XTENSA) && !MMU)
> +	depends on ARM || ((M68K || RISCV || SUPERH || UML || XTENSA) && !MMU)
>  	select ELFCORE
>  	help
>  	  ELF FDPIC binaries are based on ELF, but allow the individual load
diff mbox series

Patch

diff --git a/arch/um/include/asm/mmu.h b/arch/um/include/asm/mmu.h
index a3eaca41ff61..01422b761aa0 100644
--- a/arch/um/include/asm/mmu.h
+++ b/arch/um/include/asm/mmu.h
@@ -14,6 +14,11 @@  typedef struct mm_context {
 	/* Address range in need of a TLB sync */
 	unsigned long sync_tlb_range_from;
 	unsigned long sync_tlb_range_to;
+
+#ifdef CONFIG_BINFMT_ELF_FDPIC
+	unsigned long   exec_fdpic_loadmap;
+	unsigned long   interp_fdpic_loadmap;
+#endif
 } mm_context_t;
 
 #endif
diff --git a/arch/um/include/asm/ptrace-generic.h b/arch/um/include/asm/ptrace-generic.h
index 4696f24d1492..4ff844bcb1cd 100644
--- a/arch/um/include/asm/ptrace-generic.h
+++ b/arch/um/include/asm/ptrace-generic.h
@@ -29,6 +29,12 @@  struct pt_regs {
 
 #define PTRACE_OLDSETOPTIONS 21
 
+#ifdef CONFIG_BINFMT_ELF_FDPIC
+#define PTRACE_GETFDPIC		31
+#define PTRACE_GETFDPIC_EXEC	0
+#define PTRACE_GETFDPIC_INTERP	1
+#endif
+
 struct task_struct;
 
 extern long subarch_ptrace(struct task_struct *child, long request,
diff --git a/arch/x86/um/asm/elf.h b/arch/x86/um/asm/elf.h
index 62ed5d68a978..33f69f1eac10 100644
--- a/arch/x86/um/asm/elf.h
+++ b/arch/x86/um/asm/elf.h
@@ -9,6 +9,7 @@ 
 #include <skas.h>
 
 #define CORE_DUMP_USE_REGSET
+#define ELF_FDPIC_CORE_EFLAGS  0
 
 #ifdef CONFIG_X86_32
 
@@ -190,8 +191,11 @@  extern int arch_setup_additional_pages(struct linux_binprm *bprm,
 
 extern unsigned long um_vdso_addr;
 #define AT_SYSINFO_EHDR 33
-#define ARCH_DLINFO	NEW_AUX_ENT(AT_SYSINFO_EHDR, um_vdso_addr)
-
+#define ARCH_DLINFO						\
+do {								\
+	NEW_AUX_ENT(AT_SYSINFO_EHDR, um_vdso_addr);		\
+	NEW_AUX_ENT(AT_MINSIGSTKSZ, 0);			\
+} while (0)
 #endif
 
 typedef unsigned long elf_greg_t;
diff --git a/fs/Kconfig.binfmt b/fs/Kconfig.binfmt
index bd2f530e5740..419ba0282806 100644
--- a/fs/Kconfig.binfmt
+++ b/fs/Kconfig.binfmt
@@ -58,7 +58,7 @@  config ARCH_USE_GNU_PROPERTY
 config BINFMT_ELF_FDPIC
 	bool "Kernel support for FDPIC ELF binaries"
 	default y if !BINFMT_ELF
-	depends on ARM || ((M68K || RISCV || SUPERH || XTENSA) && !MMU)
+	depends on ARM || ((M68K || RISCV || SUPERH || UML || XTENSA) && !MMU)
 	select ELFCORE
 	help
 	  ELF FDPIC binaries are based on ELF, but allow the individual load