LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* [PATCH mm] Remove deprecation of a.out ELF interpreters
@ 2008-01-30 8:40 Andi Kleen
2008-01-30 23:29 ` Andrew Morton
0 siblings, 1 reply; 5+ messages in thread
From: Andi Kleen @ 2008-01-30 8:40 UTC (permalink / raw)
To: akpm; +Cc: linux-kernel
Andrew has already queued the patch to remove the support for a.out
ELF interpreters. So remove the deprecation with it too.
Signed-off-by: Andi Kleen <ak@suse.de>
Index: linux/Documentation/feature-removal-schedule.txt
===================================================================
--- linux.orig/Documentation/feature-removal-schedule.txt
+++ linux/Documentation/feature-removal-schedule.txt
@@ -107,17 +107,6 @@ Who: Eric Biederman <ebiederm@xmission.c
---------------------------
-What: a.out interpreter support for ELF executables
-When: 2.6.25
-Files: fs/binfmt_elf.c
-Why: Using a.out interpreters for ELF executables was a feature for
- transition from a.out to ELF. But now it is unlikely to be still
- needed anymore and removing it would simplify the hairy ELF
- loader code.
-Who: Andi Kleen <ak@suse.de>
-
----------------------------
-
What: remove EXPORT_SYMBOL(kernel_thread)
When: August 2006
Files: arch/*/kernel/*_ksyms.c
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH mm] Remove deprecation of a.out ELF interpreters
2008-01-30 8:40 [PATCH mm] Remove deprecation of a.out ELF interpreters Andi Kleen
@ 2008-01-30 23:29 ` Andrew Morton
2008-01-31 3:09 ` Andi Kleen
0 siblings, 1 reply; 5+ messages in thread
From: Andrew Morton @ 2008-01-30 23:29 UTC (permalink / raw)
To: Andi Kleen; +Cc: linux-kernel
On Wed, 30 Jan 2008 09:40:41 +0100
Andi Kleen <andi@firstfloor.org> wrote:
>
> Andrew has already queued the patch to remove the support for a.out
> ELF interpreters. So remove the deprecation with it too.
>
I'm trying to find which patch I might have queued which did this and came
up blank.
aout-suppress-aout-library-support-if-config_arch_supports_aout.patch is
the only relevant one.
You have such a patch in your tree but afaict that will just wreck David's
patch.
Confused.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH mm] Remove deprecation of a.out ELF interpreters
2008-01-30 23:29 ` Andrew Morton
@ 2008-01-31 3:09 ` Andi Kleen
2008-01-31 6:11 ` Andrew Morton
0 siblings, 1 reply; 5+ messages in thread
From: Andi Kleen @ 2008-01-31 3:09 UTC (permalink / raw)
To: Andrew Morton; +Cc: Andi Kleen, linux-kernel
On Wed, Jan 30, 2008 at 03:29:15PM -0800, Andrew Morton wrote:
> On Wed, 30 Jan 2008 09:40:41 +0100
> Andi Kleen <andi@firstfloor.org> wrote:
>
> >
> > Andrew has already queued the patch to remove the support for a.out
> > ELF interpreters. So remove the deprecation with it too.
> >
>
> I'm trying to find which patch I might have queued which did this and came
> up blank.
Sorry I somehow thought you had it queued.
My patch makes parts of David's patch obsolete because he makes
the code ifdef, but I remove the code completely. David also
does some other cleanups which still make sense.
So I think the correct way is to apply my patch first and then David's
and just ignore all the rejects and refresh. The result should be correct.
Basically after that only the core dump changes in David's patch should
be left over.
Can you do that or should I resubmit both patches in a merged form?
(I can do that too)
-Andi
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH mm] Remove deprecation of a.out ELF interpreters
2008-01-31 3:09 ` Andi Kleen
@ 2008-01-31 6:11 ` Andrew Morton
2008-01-31 7:35 ` Andi Kleen
0 siblings, 1 reply; 5+ messages in thread
From: Andrew Morton @ 2008-01-31 6:11 UTC (permalink / raw)
To: Andi Kleen; +Cc: linux-kernel
On Thu, 31 Jan 2008 04:09:19 +0100 Andi Kleen <andi@firstfloor.org> wrote:
> On Wed, Jan 30, 2008 at 03:29:15PM -0800, Andrew Morton wrote:
> > On Wed, 30 Jan 2008 09:40:41 +0100
> > Andi Kleen <andi@firstfloor.org> wrote:
> >
> > >
> > > Andrew has already queued the patch to remove the support for a.out
> > > ELF interpreters. So remove the deprecation with it too.
> > >
> >
> > I'm trying to find which patch I might have queued which did this and came
> > up blank.
>
> Sorry I somehow thought you had it queued.
>
> My patch makes parts of David's patch obsolete because he makes
> the code ifdef, but I remove the code completely. David also
> does some other cleanups which still make sense.
>
> So I think the correct way is to apply my patch first and then David's
> and just ignore all the rejects and refresh. The result should be correct.
>
> Basically after that only the core dump changes in David's patch should
> be left over.
>
> Can you do that or should I resubmit both patches in a merged form?
> (I can do that too)
>
Your patch on top of rc8-mm1 would be simplest for me.
I'm at a bit of a loss because I don't appear to have a copy of the patch
which we're discussing handy.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH mm] Remove deprecation of a.out ELF interpreters
2008-01-31 6:11 ` Andrew Morton
@ 2008-01-31 7:35 ` Andi Kleen
0 siblings, 0 replies; 5+ messages in thread
From: Andi Kleen @ 2008-01-31 7:35 UTC (permalink / raw)
To: Andrew Morton; +Cc: Andi Kleen, linux-kernel
> Your patch on top of rc8-mm1 would be simplest for me.
Here you go. I also folded in the update deprecation file patch so
you only need this one, nothing else.
-Andi
---
Remove a.out interpreter support in ELF loader
-mm patch for now. To be applied to 2.6.25.
Following the deprecation schedule the a.out ELF interpreter support
is removed now with this patch. a.out ELF interpreters were an transition
feature for moving a.out systems to ELF, but they're unlikely to be still
needed. Pure a.out systems will still work of course. This allows to
simplify the hairy ELF loader.
Signed-off-by: Andi Kleen <ak@suse.de>
---
Documentation/feature-removal-schedule.txt | 11 --
fs/binfmt_elf.c | 129 +----------------------------
2 files changed, 8 insertions(+), 132 deletions(-)
Index: linux-2.6.24-rc8-mm1/fs/binfmt_elf.c
===================================================================
--- linux-2.6.24-rc8-mm1.orig/fs/binfmt_elf.c
+++ linux-2.6.24-rc8-mm1/fs/binfmt_elf.c
@@ -134,8 +134,7 @@ static int padzero(unsigned long elf_bss
static int
create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec,
- int interp_aout, unsigned long load_addr,
- unsigned long interp_load_addr)
+ unsigned long load_addr, unsigned long interp_load_addr)
{
unsigned long p = bprm->p;
int argc = bprm->argc;
@@ -223,12 +222,7 @@ create_elf_tables(struct linux_binprm *b
sp = STACK_ADD(p, ei_index);
- items = (argc + 1) + (envc + 1);
- if (interp_aout) {
- items += 3; /* a.out interpreters require argv & envp too */
- } else {
- items += 1; /* ELF interpreters only put argc on the stack */
- }
+ items = (argc + 1) + (envc + 1) + 1;
bprm->p = STACK_ROUND(sp, items);
/* Point sp at the lowest address on the stack */
@@ -251,16 +245,8 @@ create_elf_tables(struct linux_binprm *b
/* Now, let's put argc (and argv, envp if appropriate) on the stack */
if (__put_user(argc, sp++))
return -EFAULT;
- if (interp_aout) {
- argv = sp + 2;
- envp = argv + argc + 1;
- if (__put_user((elf_addr_t)(unsigned long)argv, sp++) ||
- __put_user((elf_addr_t)(unsigned long)envp, sp++))
- return -EFAULT;
- } else {
- argv = sp;
- envp = argv + argc + 1;
- }
+ argv = sp;
+ envp = argv + argc + 1;
/* Populate argv and envp */
p = current->mm->arg_end = current->mm->arg_start;
@@ -513,61 +499,6 @@ out:
return error;
}
-#ifdef CONFIG_ARCH_SUPPORTS_AOUT
-static unsigned long load_aout_interp(struct exec *interp_ex,
- struct file *interpreter)
-{
- unsigned long text_data, elf_entry = ~0UL;
- char __user * addr;
- loff_t offset;
-
- current->mm->end_code = interp_ex->a_text;
- text_data = interp_ex->a_text + interp_ex->a_data;
- current->mm->end_data = text_data;
- current->mm->brk = interp_ex->a_bss + text_data;
-
- switch (N_MAGIC(*interp_ex)) {
- case OMAGIC:
- offset = 32;
- addr = (char __user *)0;
- break;
- case ZMAGIC:
- case QMAGIC:
- offset = N_TXTOFF(*interp_ex);
- addr = (char __user *)N_TXTADDR(*interp_ex);
- break;
- default:
- goto out;
- }
-
- down_write(¤t->mm->mmap_sem);
- do_brk(0, text_data);
- up_write(¤t->mm->mmap_sem);
- if (!interpreter->f_op || !interpreter->f_op->read)
- goto out;
- if (interpreter->f_op->read(interpreter, addr, text_data, &offset) < 0)
- goto out;
- flush_icache_range((unsigned long)addr,
- (unsigned long)addr + text_data);
-
- down_write(¤t->mm->mmap_sem);
- do_brk(ELF_PAGESTART(text_data + ELF_MIN_ALIGN - 1),
- interp_ex->a_bss);
- up_write(¤t->mm->mmap_sem);
- elf_entry = interp_ex->a_entry;
-
-out:
- return elf_entry;
-}
-#else
-/* dummy extern - the function should never be called if !CONFIG_AOUT_BINFMT */
-static inline unsigned long load_aout_interp(struct exec *interp_ex,
- struct file *interpreter)
-{
- return -ELIBACC;
-}
-#endif
-
/*
* These are the functions used to load ELF style executables and shared
* libraries. There is no binary dependent code anywhere else.
@@ -576,13 +507,6 @@ static inline unsigned long load_aout_in
#define INTERPRETER_NONE 0
#define INTERPRETER_ELF 2
-#ifdef CONFIG_ARCH_SUPPORTS_AOUT
-#define INTERPRETER_AOUT 1
-#define IS_AOUT_INTERP(x) ((x) == INTERPRETER_AOUT)
-#else
-#define IS_AOUT_INTERP(x) (0)
-#endif
-
#ifndef STACK_RND_MASK
#define STACK_RND_MASK (0x7ff >> (PAGE_SHIFT - 12)) /* 8MB of VA */
#endif
@@ -609,7 +533,6 @@ static int load_elf_binary(struct linux_
unsigned long load_addr = 0, load_bias = 0;
int load_addr_set = 0;
char * elf_interpreter = NULL;
- unsigned int interpreter_type = INTERPRETER_NONE;
unsigned char ibcs2_interpreter = 0;
unsigned long error;
struct elf_phdr *elf_ppnt, *elf_phdata;
@@ -621,7 +544,6 @@ static int load_elf_binary(struct linux_
unsigned long interp_load_addr = 0;
unsigned long start_code, end_code, start_data, end_data;
unsigned long reloc_func_desc = 0;
- char passed_fileno[6];
struct files_struct *files;
int executable_stack = EXSTACK_DEFAULT;
unsigned long def_flags = 0;
@@ -798,62 +720,18 @@ static int load_elf_binary(struct linux_
/* Some simple consistency checks for the interpreter */
if (elf_interpreter) {
- static int warn;
-#ifdef CONFIG_ARCH_SUPPORTS_AOUT
- interpreter_type = INTERPRETER_ELF | INTERPRETER_AOUT;
-
- /* Now figure out which format our binary is */
- if ((N_MAGIC(loc->interp_ex) != OMAGIC) &&
- (N_MAGIC(loc->interp_ex) != ZMAGIC) &&
- (N_MAGIC(loc->interp_ex) != QMAGIC))
- interpreter_type = INTERPRETER_ELF;
-#else
- interpreter_type = INTERPRETER_ELF;
-#endif
- if (memcmp(loc->interp_elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
- interpreter_type &= ~INTERPRETER_ELF;
-
- if (IS_AOUT_INTERP(interpreter_type) && warn < 10) {
- printk(KERN_WARNING "a.out ELF interpreter %s is "
- "deprecated and will not be supported "
- "after Linux 2.6.25\n", elf_interpreter);
- warn++;
- }
-
retval = -ELIBBAD;
- if (!interpreter_type)
+ /* Not an ELF interpreter */
+ if (memcmp(loc->interp_elf_ex.e_ident, ELFMAG, SELFMAG) != 0)
goto out_free_dentry;
-
- /* Make sure only one type was selected */
- if ((interpreter_type & INTERPRETER_ELF) &&
- interpreter_type != INTERPRETER_ELF) {
- // FIXME - ratelimit this before re-enabling
- // printk(KERN_WARNING "ELF: Ambiguous type, using ELF\n");
- interpreter_type = INTERPRETER_ELF;
- }
/* Verify the interpreter has a valid arch */
- if ((interpreter_type == INTERPRETER_ELF) &&
- !elf_check_arch(&loc->interp_elf_ex))
+ if (!elf_check_arch(&loc->interp_elf_ex))
goto out_free_dentry;
} else {
/* Executables without an interpreter also need a personality */
SET_PERSONALITY(loc->elf_ex, ibcs2_interpreter);
}
- /* OK, we are done with that, now set up the arg stuff,
- and then start this sucker up */
- if (IS_AOUT_INTERP(interpreter_type) && !bprm->sh_bang) {
- char *passed_p = passed_fileno;
- sprintf(passed_fileno, "%d", elf_exec_fileno);
-
- if (elf_interpreter) {
- retval = copy_strings_kernel(1, &passed_p, bprm);
- if (retval)
- goto out_free_dentry;
- bprm->argc++;
- }
- }
-
/* Flush all traces of the currently running executable */
retval = flush_old_exec(bprm);
if (retval)
@@ -1031,24 +909,19 @@ static int load_elf_binary(struct linux_
}
if (elf_interpreter) {
- if (IS_AOUT_INTERP(interpreter_type)) {
- elf_entry = load_aout_interp(&loc->interp_ex,
- interpreter);
- } else {
- unsigned long uninitialized_var(interp_map_addr);
-
- elf_entry = load_elf_interp(&loc->interp_elf_ex,
- interpreter,
- &interp_map_addr,
- load_bias);
- if (!IS_ERR((void *)elf_entry)) {
- /*
- * load_elf_interp() returns relocation
- * adjustment
- */
- interp_load_addr = elf_entry;
- elf_entry += loc->interp_elf_ex.e_entry;
- }
+ unsigned long uninitialized_var(interp_map_addr);
+
+ elf_entry = load_elf_interp(&loc->interp_elf_ex,
+ interpreter,
+ &interp_map_addr,
+ load_bias);
+ if (!IS_ERR((void *)elf_entry)) {
+ /*
+ * load_elf_interp() returns relocation
+ * adjustment
+ */
+ interp_load_addr = elf_entry;
+ elf_entry += loc->interp_elf_ex.e_entry;
}
if (BAD_ADDR(elf_entry)) {
force_sig(SIGSEGV, current);
@@ -1072,8 +945,7 @@ static int load_elf_binary(struct linux_
kfree(elf_phdata);
- if (!IS_AOUT_INTERP(interpreter_type))
- sys_close(elf_exec_fileno);
+ sys_close(elf_exec_fileno);
set_binfmt(&elf_format);
@@ -1088,15 +960,12 @@ static int load_elf_binary(struct linux_
compute_creds(bprm);
current->flags &= ~PF_FORKNOEXEC;
retval = create_elf_tables(bprm, &loc->elf_ex,
- IS_AOUT_INTERP(interpreter_type),
load_addr, interp_load_addr);
if (retval < 0) {
send_sig(SIGKILL, current, 0);
goto out;
}
/* N.B. passed_fileno might not be initialized? */
- if (IS_AOUT_INTERP(interpreter_type))
- current->mm->arg_start += strlen(passed_fileno) + 1;
current->mm->end_code = end_code;
current->mm->start_code = start_code;
current->mm->start_data = start_data;
Index: linux-2.6.24-rc8-mm1/Documentation/feature-removal-schedule.txt
===================================================================
--- linux-2.6.24-rc8-mm1.orig/Documentation/feature-removal-schedule.txt
+++ linux-2.6.24-rc8-mm1/Documentation/feature-removal-schedule.txt
@@ -90,17 +90,6 @@ Who: Eric Biederman <ebiederm@xmission.c
---------------------------
-What: a.out interpreter support for ELF executables
-When: 2.6.25
-Files: fs/binfmt_elf.c
-Why: Using a.out interpreters for ELF executables was a feature for
- transition from a.out to ELF. But now it is unlikely to be still
- needed anymore and removing it would simplify the hairy ELF
- loader code.
-Who: Andi Kleen <ak@suse.de>
-
----------------------------
-
What: remove EXPORT_SYMBOL(kernel_thread)
When: August 2006
Files: arch/*/kernel/*_ksyms.c
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2008-01-31 7:01 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-01-30 8:40 [PATCH mm] Remove deprecation of a.out ELF interpreters Andi Kleen
2008-01-30 23:29 ` Andrew Morton
2008-01-31 3:09 ` Andi Kleen
2008-01-31 6:11 ` Andrew Morton
2008-01-31 7:35 ` Andi Kleen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).