Commit bc3d7bf6 authored by Gabriel Krisman Bertazi's avatar Gabriel Krisman Bertazi Committed by Thomas Gleixner
Browse files

elf: Expose ELF header in compat_start_thread()



Like it is done for SET_PERSONALITY with x86, which requires the ELF header
to select correct personality parameters, x86 requires the headers on
compat_start_thread() to choose starting CS for ELF32 binaries, instead of
relying on the going-away TIF_IA32/X32 flags.

Add an indirection macro to ELF invocations of START_THREAD, that x86 can
reimplement to receive the extra parameter just for ELF files.  This
requires no changes to other architectures who don't need the header
information, they can continue to use the original start_thread for ELF and
non-ELF binaries, and it prevents affecting non-ELF code paths for x86.

Signed-off-by: default avatarGabriel Krisman Bertazi <krisman@collabora.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20201004032536.1229030-6-krisman@collabora.com
parent 2656af0d
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -1307,7 +1307,7 @@ static int load_elf_binary(struct linux_binprm *bprm)
#endif
#endif


	finalize_exec(bprm);
	finalize_exec(bprm);
	start_thread(regs, elf_entry, bprm->p);
	START_THREAD(elf_ex, regs, elf_entry, bprm->p);
	retval = 0;
	retval = 0;
out:
out:
	return retval;
	return retval;
+7 −2
Original line number Original line Diff line number Diff line
@@ -106,8 +106,13 @@
#endif
#endif


#ifdef	compat_start_thread
#ifdef	compat_start_thread
#undef	start_thread
#define COMPAT_START_THREAD(ex, regs, new_ip, new_sp)	\
#define	start_thread		compat_start_thread
	compat_start_thread(regs, new_ip, new_sp)
#endif

#ifdef	COMPAT_START_THREAD
#undef	START_THREAD
#define START_THREAD		COMPAT_START_THREAD
#endif
#endif


#ifdef	compat_arch_setup_additional_pages
#ifdef	compat_arch_setup_additional_pages
+5 −0
Original line number Original line Diff line number Diff line
@@ -22,6 +22,11 @@
	SET_PERSONALITY(ex)
	SET_PERSONALITY(ex)
#endif
#endif


#ifndef START_THREAD
#define START_THREAD(elf_ex, regs, elf_entry, start_stack)	\
	start_thread(regs, elf_entry, start_stack)
#endif

#define ELF32_GNU_PROPERTY_ALIGN	4
#define ELF32_GNU_PROPERTY_ALIGN	4
#define ELF64_GNU_PROPERTY_ALIGN	8
#define ELF64_GNU_PROPERTY_ALIGN	8