2 * linux/fs/binfmt_elf.c
4 * These are the functions used to load ELF format executables as used
5 * on SVr4 machines. Information on the format may be found in the book
6 * "UNIX SYSTEM V RELEASE 4 Programmers Guide: Ansi C and Programming Support
9 * Copyright 1993, 1994: Eric Youngdale (ericy@cais.com).
12 #include <linux/module.h>
15 #include <linux/stat.h>
16 #include <linux/sched.h>
18 #include <linux/mman.h>
19 #include <linux/a.out.h>
20 #include <linux/errno.h>
21 #include <linux/signal.h>
22 #include <linux/binfmts.h>
23 #include <linux/string.h>
24 #include <linux/file.h>
25 #include <linux/fcntl.h>
26 #include <linux/ptrace.h>
27 #include <linux/malloc.h>
28 #include <linux/shm.h>
29 #include <linux/personality.h>
30 #include <linux/elfcore.h>
31 #include <linux/init.h>
33 #include <asm/uaccess.h>
34 #include <asm/pgtable.h>
36 #include <linux/config.h>
38 #define DLINFO_ITEMS 13
40 #include <linux/elf.h>
42 static int load_elf_binary(struct linux_binprm
* bprm
, struct pt_regs
* regs
);
43 static int load_elf_library(int fd
);
44 extern int dump_fpu (struct pt_regs
*, elf_fpregset_t
*);
45 extern void dump_thread(struct pt_regs
*, struct user
*);
48 #define elf_addr_t unsigned long
49 #define elf_caddr_t char *
53 * If we don't support core dumping, then supply a NULL so we
56 #ifdef USE_ELF_CORE_DUMP
57 static int elf_core_dump(long signr
, struct pt_regs
* regs
, struct file
* file
);
59 #define elf_core_dump NULL
62 #define ELF_PAGESTART(_v) ((_v) & ~(unsigned long)(ELF_EXEC_PAGESIZE-1))
63 #define ELF_PAGEOFFSET(_v) ((_v) & (ELF_EXEC_PAGESIZE-1))
64 #define ELF_PAGEALIGN(_v) (((_v) + ELF_EXEC_PAGESIZE - 1) & ~(ELF_EXEC_PAGESIZE - 1))
66 static struct linux_binfmt elf_format
= {
73 load_elf_binary
, load_elf_library
, elf_core_dump
, ELF_EXEC_PAGESIZE
76 static void set_brk(unsigned long start
, unsigned long end
)
78 start
= ELF_PAGEALIGN(start
);
79 end
= ELF_PAGEALIGN(end
);
82 do_brk(start
, end
- start
);
86 /* We need to explicitly zero any fractional pages
87 after the data section (i.e. bss). This would
88 contain the junk from the file that should not
92 static void padzero(unsigned long elf_bss
)
96 nbyte
= ELF_PAGEOFFSET(elf_bss
);
98 nbyte
= ELF_EXEC_PAGESIZE
- nbyte
;
99 clear_user((void *) elf_bss
, nbyte
);
104 create_elf_tables(char *p
, int argc
, int envc
,
105 struct elfhdr
* exec
,
106 unsigned long load_addr
,
107 unsigned long load_bias
,
108 unsigned long interp_load_addr
, int ibcs
)
112 elf_addr_t
*sp
, *csp
;
113 char *k_platform
, *u_platform
;
115 size_t platform_len
= 0;
118 * Get hold of platform and hardware capabilities masks for
119 * the machine we are running on. In some cases (Sparc),
120 * this info is impossible to get, in others (i386) it is
125 k_platform
= ELF_PLATFORM
;
128 platform_len
= strlen(k_platform
) + 1;
129 u_platform
= p
- platform_len
;
130 __copy_to_user(u_platform
, k_platform
, platform_len
);
135 * Force 16 byte _final_ alignment here for generality.
136 * Leave an extra 16 bytes free so that on the PowerPC we
137 * can move the aux table up to start on a 16-byte boundary.
139 sp
= (elf_addr_t
*)((~15UL & (unsigned long)(u_platform
)) - 16UL);
141 csp
-= ((exec
? DLINFO_ITEMS
*2 : 4) + (k_platform
? 2 : 0));
144 csp
-= (!ibcs
? 3 : 1); /* argc itself */
145 if ((unsigned long)csp
& 15UL)
146 sp
-= ((unsigned long)csp
& 15UL) / sizeof(*sp
);
149 * Put the ELF interpreter info on the stack
151 #define NEW_AUX_ENT(nr, id, val) \
152 __put_user ((id), sp+(nr*2)); \
153 __put_user ((val), sp+(nr*2+1)); \
156 NEW_AUX_ENT(0, AT_NULL
, 0);
159 NEW_AUX_ENT(0, AT_PLATFORM
, (elf_addr_t
)(unsigned long) u_platform
);
162 NEW_AUX_ENT(0, AT_HWCAP
, hwcap
);
167 NEW_AUX_ENT(0, AT_PHDR
, load_addr
+ exec
->e_phoff
);
168 NEW_AUX_ENT(1, AT_PHENT
, sizeof (struct elf_phdr
));
169 NEW_AUX_ENT(2, AT_PHNUM
, exec
->e_phnum
);
170 NEW_AUX_ENT(3, AT_PAGESZ
, ELF_EXEC_PAGESIZE
);
171 NEW_AUX_ENT(4, AT_BASE
, interp_load_addr
);
172 NEW_AUX_ENT(5, AT_FLAGS
, 0);
173 NEW_AUX_ENT(6, AT_ENTRY
, load_bias
+ exec
->e_entry
);
174 NEW_AUX_ENT(7, AT_UID
, (elf_addr_t
) current
->uid
);
175 NEW_AUX_ENT(8, AT_EUID
, (elf_addr_t
) current
->euid
);
176 NEW_AUX_ENT(9, AT_GID
, (elf_addr_t
) current
->gid
);
177 NEW_AUX_ENT(10, AT_EGID
, (elf_addr_t
) current
->egid
);
182 envp
= (elf_caddr_t
*) sp
;
184 argv
= (elf_caddr_t
*) sp
;
186 __put_user((elf_addr_t
)(unsigned long) envp
,--sp
);
187 __put_user((elf_addr_t
)(unsigned long) argv
,--sp
);
190 __put_user((elf_addr_t
)argc
,--sp
);
191 current
->mm
->arg_start
= (unsigned long) p
;
193 __put_user((elf_caddr_t
)(unsigned long)p
,argv
++);
196 __put_user(NULL
, argv
);
197 current
->mm
->arg_end
= current
->mm
->env_start
= (unsigned long) p
;
199 __put_user((elf_caddr_t
)(unsigned long)p
,envp
++);
202 __put_user(NULL
, envp
);
203 current
->mm
->env_end
= (unsigned long) p
;
208 /* This is much more generalized than the library routine read function,
209 so we keep this separate. Technically the library read function
210 is only provided so that we can read a.out libraries that have
213 static unsigned long load_elf_interp(struct elfhdr
* interp_elf_ex
,
214 struct dentry
* interpreter_dentry
,
215 unsigned long *interp_load_addr
)
218 struct elf_phdr
*elf_phdata
;
219 struct elf_phdr
*eppnt
;
220 unsigned long load_addr
= 0;
221 int load_addr_set
= 0;
222 unsigned long last_bss
= 0, elf_bss
= 0;
223 unsigned long error
= ~0UL;
227 /* First of all, some simple consistency checks */
228 if (interp_elf_ex
->e_type
!= ET_EXEC
&&
229 interp_elf_ex
->e_type
!= ET_DYN
)
231 if (!elf_check_arch(interp_elf_ex
->e_machine
))
233 if (!interpreter_dentry
->d_inode
->i_op
||
234 !interpreter_dentry
->d_inode
->i_op
->default_file_ops
->mmap
)
238 * If the size of this structure has changed, then punt, since
239 * we will be doing the wrong thing.
241 if (interp_elf_ex
->e_phentsize
!= sizeof(struct elf_phdr
))
244 /* Now read in all of the header information */
246 size
= sizeof(struct elf_phdr
) * interp_elf_ex
->e_phnum
;
247 if (size
> ELF_EXEC_PAGESIZE
)
249 elf_phdata
= (struct elf_phdr
*) kmalloc(size
, GFP_KERNEL
);
253 retval
= read_exec(interpreter_dentry
, interp_elf_ex
->e_phoff
,
254 (char *) elf_phdata
, size
, 1);
260 elf_exec_fileno
= open_dentry(interpreter_dentry
, O_RDONLY
);
261 if (elf_exec_fileno
< 0)
263 file
= fget(elf_exec_fileno
);
266 for (i
=0; i
<interp_elf_ex
->e_phnum
; i
++, eppnt
++) {
267 if (eppnt
->p_type
== PT_LOAD
) {
268 int elf_type
= MAP_PRIVATE
| MAP_DENYWRITE
;
270 unsigned long vaddr
= 0;
271 unsigned long k
, map_addr
;
273 if (eppnt
->p_flags
& PF_R
) elf_prot
= PROT_READ
;
274 if (eppnt
->p_flags
& PF_W
) elf_prot
|= PROT_WRITE
;
275 if (eppnt
->p_flags
& PF_X
) elf_prot
|= PROT_EXEC
;
276 vaddr
= eppnt
->p_vaddr
;
277 if (interp_elf_ex
->e_type
== ET_EXEC
|| load_addr_set
) {
278 elf_type
|= MAP_FIXED
;
281 load_addr
= get_unmapped_area(0, eppnt
->p_filesz
+
282 ELF_PAGEOFFSET(vaddr
));
286 map_addr
= do_mmap(file
,
287 load_addr
+ ELF_PAGESTART(vaddr
),
288 eppnt
->p_filesz
+ ELF_PAGEOFFSET(eppnt
->p_vaddr
),
291 eppnt
->p_offset
- ELF_PAGEOFFSET(eppnt
->p_vaddr
));
292 if (map_addr
> -1024UL) /* Real error */
295 if (!load_addr_set
&& interp_elf_ex
->e_type
== ET_DYN
) {
296 load_addr
= map_addr
- ELF_PAGESTART(vaddr
);
301 * Find the end of the file mapping for this phdr, and keep
302 * track of the largest address we see for this.
304 k
= load_addr
+ eppnt
->p_vaddr
+ eppnt
->p_filesz
;
309 * Do the same thing for the memory mapping - between
310 * elf_bss and last_bss is the bss section.
312 k
= load_addr
+ eppnt
->p_memsz
+ eppnt
->p_vaddr
;
318 /* Now use mmap to map the library into memory. */
321 * Now fill out the bss section. First pad the last page up
322 * to the page boundary, and then perform a mmap to make sure
323 * that there are zero-mapped pages up to and including the
327 elf_bss
= ELF_PAGESTART(elf_bss
+ ELF_EXEC_PAGESIZE
- 1); /* What we have mapped so far */
329 /* Map the last of the bss segment */
330 if (last_bss
> elf_bss
)
331 do_brk(elf_bss
, last_bss
- elf_bss
);
333 *interp_load_addr
= load_addr
;
334 error
= ((unsigned long) interp_elf_ex
->e_entry
) + load_addr
;
338 sys_close(elf_exec_fileno
);
345 static unsigned long load_aout_interp(struct exec
* interp_ex
,
346 struct dentry
* interpreter_dentry
)
348 unsigned long text_data
, offset
, elf_entry
= ~0UL;
352 current
->mm
->end_code
= interp_ex
->a_text
;
353 text_data
= interp_ex
->a_text
+ interp_ex
->a_data
;
354 current
->mm
->end_data
= text_data
;
355 current
->mm
->brk
= interp_ex
->a_bss
+ text_data
;
357 switch (N_MAGIC(*interp_ex
)) {
364 offset
= N_TXTOFF(*interp_ex
);
365 addr
= (char *) N_TXTADDR(*interp_ex
);
371 do_brk(0, text_data
);
372 retval
= read_exec(interpreter_dentry
, offset
, addr
, text_data
, 0);
375 flush_icache_range((unsigned long)addr
,
376 (unsigned long)addr
+ text_data
);
378 do_brk(ELF_PAGESTART(text_data
+ ELF_EXEC_PAGESIZE
- 1),
380 elf_entry
= interp_ex
->a_entry
;
387 * These are the functions used to load ELF style executables and shared
388 * libraries. There is no binary dependent code anywhere else.
391 #define INTERPRETER_NONE 0
392 #define INTERPRETER_AOUT 1
393 #define INTERPRETER_ELF 2
397 do_load_elf_binary(struct linux_binprm
* bprm
, struct pt_regs
* regs
)
400 struct dentry
*interpreter_dentry
= NULL
; /* to shut gcc up */
401 unsigned long load_addr
= 0, load_bias
;
402 int load_addr_set
= 0;
403 char * elf_interpreter
= NULL
;
404 unsigned int interpreter_type
= INTERPRETER_NONE
;
405 unsigned char ibcs2_interpreter
= 0;
408 struct elf_phdr
* elf_ppnt
, *elf_phdata
;
409 unsigned long elf_bss
, k
, elf_brk
;
412 unsigned long elf_entry
, interp_load_addr
= 0;
413 unsigned long start_code
, end_code
, end_data
;
414 struct elfhdr elf_ex
;
415 struct elfhdr interp_elf_ex
;
416 struct exec interp_ex
;
417 char passed_fileno
[6];
419 /* Get the exec-header */
420 elf_ex
= *((struct elfhdr
*) bprm
->buf
);
423 /* First of all, some simple consistency checks */
424 if (elf_ex
.e_ident
[0] != 0x7f ||
425 strncmp(&elf_ex
.e_ident
[1], "ELF", 3) != 0)
428 if (elf_ex
.e_type
!= ET_EXEC
&& elf_ex
.e_type
!= ET_DYN
)
430 if (!elf_check_arch(elf_ex
.e_machine
))
433 /* IRIX binaries handled elsewhere. */
434 if (elf_ex
.e_flags
& EF_MIPS_ARCH
) {
439 if (!bprm
->dentry
->d_inode
->i_op
||
440 !bprm
->dentry
->d_inode
->i_op
->default_file_ops
||
441 !bprm
->dentry
->d_inode
->i_op
->default_file_ops
->mmap
)
444 /* Now read in all of the header information */
447 size
= elf_ex
.e_phentsize
* elf_ex
.e_phnum
;
450 elf_phdata
= (struct elf_phdr
*) kmalloc(size
, GFP_KERNEL
);
454 retval
= read_exec(bprm
->dentry
, elf_ex
.e_phoff
,
455 (char *) elf_phdata
, size
, 1);
459 retval
= open_dentry(bprm
->dentry
, O_RDONLY
);
462 elf_exec_fileno
= retval
;
463 file
= fget(elf_exec_fileno
);
465 elf_ppnt
= elf_phdata
;
473 for (i
= 0; i
< elf_ex
.e_phnum
; i
++) {
474 if (elf_ppnt
->p_type
== PT_INTERP
) {
477 goto out_free_interp
;
479 /* This is the program interpreter used for
480 * shared libraries - for now assume that this
481 * is an a.out format binary
485 elf_interpreter
= (char *) kmalloc(elf_ppnt
->p_filesz
,
487 if (!elf_interpreter
)
490 retval
= read_exec(bprm
->dentry
, elf_ppnt
->p_offset
,
492 elf_ppnt
->p_filesz
, 1);
494 goto out_free_interp
;
495 /* If the program interpreter is one of these two,
496 * then assume an iBCS2 image. Otherwise assume
497 * a native linux image.
499 if (strcmp(elf_interpreter
,"/usr/lib/libc.so.1") == 0 ||
500 strcmp(elf_interpreter
,"/usr/lib/ld.so.1") == 0)
501 ibcs2_interpreter
= 1;
503 printk("Using ELF interpreter %s\n", elf_interpreter
);
505 old_fs
= get_fs(); /* This could probably be optimized */
508 if (ibcs2_interpreter
) {
509 unsigned long old_pers
= current
->personality
;
511 current
->personality
= PER_SVR4
;
512 interpreter_dentry
= open_namei(elf_interpreter
,
514 current
->personality
= old_pers
;
517 interpreter_dentry
= open_namei(elf_interpreter
,
520 retval
= PTR_ERR(interpreter_dentry
);
521 if (IS_ERR(interpreter_dentry
))
522 goto out_free_interp
;
523 retval
= permission(interpreter_dentry
->d_inode
, MAY_EXEC
);
525 goto out_free_dentry
;
526 retval
= read_exec(interpreter_dentry
, 0, bprm
->buf
, 128, 1);
528 goto out_free_dentry
;
530 /* Get the exec headers */
531 interp_ex
= *((struct exec
*) bprm
->buf
);
532 interp_elf_ex
= *((struct elfhdr
*) bprm
->buf
);
537 /* Some simple consistency checks for the interpreter */
538 if (elf_interpreter
) {
539 interpreter_type
= INTERPRETER_ELF
| INTERPRETER_AOUT
;
541 /* Now figure out which format our binary is */
542 if ((N_MAGIC(interp_ex
) != OMAGIC
) &&
543 (N_MAGIC(interp_ex
) != ZMAGIC
) &&
544 (N_MAGIC(interp_ex
) != QMAGIC
))
545 interpreter_type
= INTERPRETER_ELF
;
547 if (interp_elf_ex
.e_ident
[0] != 0x7f ||
548 strncmp(&interp_elf_ex
.e_ident
[1], "ELF", 3) != 0)
549 interpreter_type
&= ~INTERPRETER_ELF
;
552 if (!interpreter_type
)
553 goto out_free_dentry
;
555 /* Make sure only one type was selected */
556 if ((interpreter_type
& INTERPRETER_ELF
) &&
557 interpreter_type
!= INTERPRETER_ELF
) {
558 printk(KERN_WARNING
"ELF: Ambiguous type, using ELF\n");
559 interpreter_type
= INTERPRETER_ELF
;
563 /* OK, we are done with that, now set up the arg stuff,
564 and then start this sucker up */
566 if (!bprm
->sh_bang
) {
569 if (interpreter_type
== INTERPRETER_AOUT
) {
570 sprintf(passed_fileno
, "%d", elf_exec_fileno
);
571 passed_p
= passed_fileno
;
573 if (elf_interpreter
) {
574 retval
= copy_strings_kernel(1,&passed_p
,bprm
);
576 goto out_free_dentry
;
582 /* Flush all traces of the currently running executable */
583 retval
= flush_old_exec(bprm
);
585 goto out_free_dentry
;
587 /* OK, This is the point of no return */
588 current
->mm
->end_data
= 0;
589 current
->mm
->end_code
= 0;
590 current
->mm
->mmap
= NULL
;
591 current
->flags
&= ~PF_FORKNOEXEC
;
592 elf_entry
= (unsigned long) elf_ex
.e_entry
;
594 /* Do this immediately, since STACK_TOP as used in setup_arg_pages
595 may depend on the personality. */
596 SET_PERSONALITY(elf_ex
, ibcs2_interpreter
);
598 /* Do this so that we can load the interpreter, if need be. We will
599 change some of these later */
600 current
->mm
->rss
= 0;
601 setup_arg_pages(bprm
); /* XXX: check error */
602 current
->mm
->start_stack
= bprm
->p
;
604 /* Try and get dynamic programs out of the way of the default mmap
605 base, as well as whatever program they might try to exec. This
606 is because the brk will follow the loader, and is not movable. */
608 load_bias
= ELF_PAGESTART(elf_ex
.e_type
==ET_DYN
? ELF_ET_DYN_BASE
: 0);
610 /* Now we do a little grungy work by mmaping the ELF image into
611 the correct location in memory. At this point, we assume that
612 the image should be loaded at fixed address, not at a variable
617 for(i
= 0, elf_ppnt
= elf_phdata
; i
< elf_ex
.e_phnum
; i
++, elf_ppnt
++) {
618 int elf_prot
= 0, elf_flags
;
621 if (elf_ppnt
->p_type
!= PT_LOAD
)
624 if (elf_ppnt
->p_flags
& PF_R
) elf_prot
|= PROT_READ
;
625 if (elf_ppnt
->p_flags
& PF_W
) elf_prot
|= PROT_WRITE
;
626 if (elf_ppnt
->p_flags
& PF_X
) elf_prot
|= PROT_EXEC
;
628 elf_flags
= MAP_PRIVATE
|MAP_DENYWRITE
|MAP_EXECUTABLE
;
630 vaddr
= elf_ppnt
->p_vaddr
;
631 if (elf_ex
.e_type
== ET_EXEC
|| load_addr_set
) {
632 elf_flags
|= MAP_FIXED
;
635 error
= do_mmap(file
, ELF_PAGESTART(load_bias
+ vaddr
),
636 (elf_ppnt
->p_filesz
+
637 ELF_PAGEOFFSET(elf_ppnt
->p_vaddr
)),
638 elf_prot
, elf_flags
, (elf_ppnt
->p_offset
-
639 ELF_PAGEOFFSET(elf_ppnt
->p_vaddr
)));
641 if (!load_addr_set
) {
643 load_addr
= (elf_ppnt
->p_vaddr
- elf_ppnt
->p_offset
);
644 if (elf_ex
.e_type
== ET_DYN
) {
646 ELF_PAGESTART(load_bias
+ vaddr
);
650 k
= elf_ppnt
->p_vaddr
;
651 if (k
< start_code
) start_code
= k
;
652 k
= elf_ppnt
->p_vaddr
+ elf_ppnt
->p_filesz
;
655 if ((elf_ppnt
->p_flags
& PF_X
) && end_code
< k
)
659 k
= elf_ppnt
->p_vaddr
+ elf_ppnt
->p_memsz
;
664 fput(file
); /* all done with the file */
666 elf_entry
+= load_bias
;
667 elf_bss
+= load_bias
;
668 elf_brk
+= load_bias
;
669 start_code
+= load_bias
;
670 end_code
+= load_bias
;
671 end_data
+= load_bias
;
673 if (elf_interpreter
) {
674 if (interpreter_type
== INTERPRETER_AOUT
)
675 elf_entry
= load_aout_interp(&interp_ex
,
678 elf_entry
= load_elf_interp(&interp_elf_ex
,
682 dput(interpreter_dentry
);
683 kfree(elf_interpreter
);
685 if (elf_entry
== ~0UL) {
686 printk(KERN_ERR
"Unable to load interpreter\n");
688 send_sig(SIGSEGV
, current
, 0);
695 if (interpreter_type
!= INTERPRETER_AOUT
)
696 sys_close(elf_exec_fileno
);
698 if (current
->exec_domain
&& current
->exec_domain
->module
)
699 __MOD_DEC_USE_COUNT(current
->exec_domain
->module
);
700 if (current
->binfmt
&& current
->binfmt
->module
)
701 __MOD_DEC_USE_COUNT(current
->binfmt
->module
);
702 current
->exec_domain
= lookup_exec_domain(current
->personality
);
703 current
->binfmt
= &elf_format
;
704 if (current
->exec_domain
&& current
->exec_domain
->module
)
705 __MOD_INC_USE_COUNT(current
->exec_domain
->module
);
706 if (current
->binfmt
&& current
->binfmt
->module
)
707 __MOD_INC_USE_COUNT(current
->binfmt
->module
);
709 #ifndef VM_STACK_FLAGS
710 current
->executable
= dget(bprm
->dentry
);
713 current
->flags
&= ~PF_FORKNOEXEC
;
714 bprm
->p
= (unsigned long)
715 create_elf_tables((char *)bprm
->p
,
718 (interpreter_type
== INTERPRETER_ELF
? &elf_ex
: NULL
),
719 load_addr
, load_bias
,
721 (interpreter_type
== INTERPRETER_AOUT
? 0 : 1));
722 /* N.B. passed_fileno might not be initialized? */
723 if (interpreter_type
== INTERPRETER_AOUT
)
724 current
->mm
->arg_start
+= strlen(passed_fileno
) + 1;
725 current
->mm
->start_brk
= current
->mm
->brk
= elf_brk
;
726 current
->mm
->end_code
= end_code
;
727 current
->mm
->start_code
= start_code
;
728 current
->mm
->end_data
= end_data
;
729 current
->mm
->start_stack
= bprm
->p
;
731 /* Calling set_brk effectively mmaps the pages that we need
732 * for the bss and break sections
734 set_brk(elf_bss
, elf_brk
);
739 printk("(start_brk) %lx\n" , (long) current
->mm
->start_brk
);
740 printk("(end_code) %lx\n" , (long) current
->mm
->end_code
);
741 printk("(start_code) %lx\n" , (long) current
->mm
->start_code
);
742 printk("(end_data) %lx\n" , (long) current
->mm
->end_data
);
743 printk("(start_stack) %lx\n" , (long) current
->mm
->start_stack
);
744 printk("(brk) %lx\n" , (long) current
->mm
->brk
);
747 if ( current
->personality
== PER_SVR4
)
749 /* Why this, you ask??? Well SVr4 maps page 0 as read-only,
750 and some applications "depend" upon this behavior.
751 Since we do not have the power to recompile these, we
752 emulate the SVr4 behavior. Sigh. */
753 /* N.B. Shouldn't the size here be PAGE_SIZE?? */
754 error
= do_mmap(NULL
, 0, 4096, PROT_READ
| PROT_EXEC
,
755 MAP_FIXED
| MAP_PRIVATE
, 0);
760 * The ABI may specify that certain registers be set up in special
761 * ways (on i386 %edx is the address of a DT_FINI function, for
762 * example. This macro performs whatever initialization to
763 * the regs structure is required.
768 start_thread(regs
, elf_entry
, bprm
->p
);
769 if (current
->flags
& PF_PTRACED
)
770 send_sig(SIGTRAP
, current
, 0);
777 dput(interpreter_dentry
);
780 kfree(elf_interpreter
);
783 sys_close(elf_exec_fileno
);
790 load_elf_binary(struct linux_binprm
* bprm
, struct pt_regs
* regs
)
795 retval
= do_load_elf_binary(bprm
, regs
);
800 /* This is really simpleminded and specialized - we are loading an
801 a.out library that is given an ELF header. */
804 do_load_elf_library(int fd
)
807 struct dentry
* dentry
;
808 struct inode
* inode
;
809 struct elf_phdr
*elf_phdata
;
810 unsigned long elf_bss
= 0, bss
, len
, k
;
811 int retval
, error
, i
, j
;
812 struct elfhdr elf_ex
;
817 if (!file
|| !file
->f_op
)
819 dentry
= file
->f_dentry
;
820 inode
= dentry
->d_inode
;
822 /* seek to the beginning of the file */
825 /* N.B. save current DS?? */
827 retval
= file
->f_op
->read(file
, (char *) &elf_ex
, sizeof(elf_ex
), &offset
);
829 if (retval
!= sizeof(elf_ex
))
832 if (elf_ex
.e_ident
[0] != 0x7f ||
833 strncmp(&elf_ex
.e_ident
[1], "ELF", 3) != 0)
836 /* First of all, some simple consistency checks */
837 if (elf_ex
.e_type
!= ET_EXEC
|| elf_ex
.e_phnum
> 2 ||
838 !elf_check_arch(elf_ex
.e_machine
) ||
839 (!inode
->i_op
|| !inode
->i_op
->default_file_ops
->mmap
))
842 /* Now read in all of the header information */
844 j
= sizeof(struct elf_phdr
) * elf_ex
.e_phnum
;
845 if (j
> ELF_EXEC_PAGESIZE
)
849 elf_phdata
= (struct elf_phdr
*) kmalloc(j
, GFP_KERNEL
);
853 /* N.B. check for error return?? */
854 retval
= read_exec(dentry
, elf_ex
.e_phoff
, (char *) elf_phdata
,
855 sizeof(struct elf_phdr
) * elf_ex
.e_phnum
, 1);
858 for (j
= 0, i
= 0; i
<elf_ex
.e_phnum
; i
++)
859 if ((elf_phdata
+ i
)->p_type
== PT_LOAD
) j
++;
863 while (elf_phdata
->p_type
!= PT_LOAD
) elf_phdata
++;
865 /* Now use mmap to map the library into memory. */
866 error
= do_mmap(file
,
867 ELF_PAGESTART(elf_phdata
->p_vaddr
),
868 (elf_phdata
->p_filesz
+
869 ELF_PAGEOFFSET(elf_phdata
->p_vaddr
)),
870 PROT_READ
| PROT_WRITE
| PROT_EXEC
,
871 MAP_FIXED
| MAP_PRIVATE
| MAP_DENYWRITE
,
872 (elf_phdata
->p_offset
-
873 ELF_PAGEOFFSET(elf_phdata
->p_vaddr
)));
874 if (error
!= ELF_PAGESTART(elf_phdata
->p_vaddr
))
877 k
= elf_phdata
->p_vaddr
+ elf_phdata
->p_filesz
;
882 len
= ELF_PAGESTART(elf_phdata
->p_filesz
+ elf_phdata
->p_vaddr
+
883 ELF_EXEC_PAGESIZE
- 1);
884 bss
= elf_phdata
->p_memsz
+ elf_phdata
->p_vaddr
;
886 do_brk(len
, bss
- len
);
897 static int load_elf_library(int fd
)
902 retval
= do_load_elf_library(fd
);
908 * Note that some platforms still use traditional core dumps and not
909 * the ELF core dump. Each platform can select it as appropriate.
911 #ifdef USE_ELF_CORE_DUMP
916 * Modelled on fs/exec.c:aout_core_dump()
917 * Jeremy Fitzhardinge <jeremy@sw.oz.au>
920 * These are the only things you should do on a core-file: use only these
921 * functions to write out all the necessary info.
923 static int dump_write(struct file
*file
, const void *addr
, int nr
)
925 return file
->f_op
->write(file
, addr
, nr
, &file
->f_pos
) == nr
;
928 static int dump_seek(struct file
*file
, off_t off
)
930 if (file
->f_op
->llseek
) {
931 if (file
->f_op
->llseek(file
, off
, 0) != off
)
939 * Decide whether a segment is worth dumping; default is yes to be
940 * sure (missing info is worse than too much; etc).
941 * Personally I'd include everything, and use the coredump limit...
943 * I think we should skip something. But I am not sure how. H.J.
945 static inline int maydump(struct vm_area_struct
*vma
)
947 if (!(vma
->vm_flags
& (VM_READ
|VM_WRITE
|VM_EXEC
)))
950 /* Do not dump I/O mapped devices! -DaveM */
951 if(vma
->vm_flags
& VM_IO
)
954 if (vma
->vm_flags
& (VM_WRITE
|VM_GROWSUP
|VM_GROWSDOWN
))
956 if (vma
->vm_flags
& (VM_READ
|VM_EXEC
|VM_EXECUTABLE
|VM_SHARED
))
962 #define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
964 /* An ELF note in memory */
973 static int notesize(struct memelfnote
*en
)
977 sz
= sizeof(struct elf_note
);
978 sz
+= roundup(strlen(en
->name
), 4);
979 sz
+= roundup(en
->datasz
, 4);
987 static void dump_regs(const char *str
, elf_greg_t
*r
)
990 static const char *regs
[] = { "ebx", "ecx", "edx", "esi", "edi", "ebp",
991 "eax", "ds", "es", "fs", "gs",
992 "orig_eax", "eip", "cs",
993 "efl", "uesp", "ss"};
994 printk("Registers: %s\n", str
);
996 for(i
= 0; i
< ELF_NGREG
; i
++)
998 unsigned long val
= r
[i
];
999 printk(" %-2d %-5s=%08lx %lu\n", i
, regs
[i
], val
, val
);
1004 #define DUMP_WRITE(addr, nr) \
1005 do { if (!dump_write(file, (addr), (nr))) return 0; } while(0)
1006 #define DUMP_SEEK(off) \
1007 do { if (!dump_seek(file, (off))) return 0; } while(0)
1009 static int writenote(struct memelfnote
*men
, struct file
*file
)
1013 en
.n_namesz
= strlen(men
->name
);
1014 en
.n_descsz
= men
->datasz
;
1015 en
.n_type
= men
->type
;
1017 DUMP_WRITE(&en
, sizeof(en
));
1018 DUMP_WRITE(men
->name
, en
.n_namesz
);
1019 /* XXX - cast from long long to long to avoid need for libgcc.a */
1020 DUMP_SEEK(roundup((unsigned long)file
->f_pos
, 4)); /* XXX */
1021 DUMP_WRITE(men
->data
, men
->datasz
);
1022 DUMP_SEEK(roundup((unsigned long)file
->f_pos
, 4)); /* XXX */
1029 #define DUMP_WRITE(addr, nr) \
1030 if (!dump_write(file, (addr), (nr))) \
1032 #define DUMP_SEEK(off) \
1033 if (!dump_seek(file, (off))) \
1038 * This is a two-pass process; first we find the offsets of the bits,
1039 * and then they are actually written out. If we run out of core limit
1042 static int elf_core_dump(long signr
, struct pt_regs
* regs
, struct file
* file
)
1049 struct vm_area_struct
*vma
;
1051 off_t offset
= 0, dataoff
;
1052 unsigned long limit
= current
->rlim
[RLIMIT_CORE
].rlim_cur
;
1054 struct memelfnote notes
[4];
1055 struct elf_prstatus prstatus
; /* NT_PRSTATUS */
1056 elf_fpregset_t fpu
; /* NT_PRFPREG */
1057 struct elf_prpsinfo psinfo
; /* NT_PRPSINFO */
1059 #ifndef CONFIG_BINFMT_ELF
1063 /* Count what's needed to dump, up to the limit of coredump size */
1066 for(vma
= current
->mm
->mmap
; vma
!= NULL
; vma
= vma
->vm_next
) {
1069 unsigned long sz
= vma
->vm_end
-vma
->vm_start
;
1071 if (size
+sz
>= limit
)
1080 printk("elf_core_dump: %d segs taking %d bytes\n", segs
, size
);
1084 memcpy(elf
.e_ident
, ELFMAG
, SELFMAG
);
1085 elf
.e_ident
[EI_CLASS
] = ELF_CLASS
;
1086 elf
.e_ident
[EI_DATA
] = ELF_DATA
;
1087 elf
.e_ident
[EI_VERSION
] = EV_CURRENT
;
1088 memset(elf
.e_ident
+EI_PAD
, 0, EI_NIDENT
-EI_PAD
);
1090 elf
.e_type
= ET_CORE
;
1091 elf
.e_machine
= ELF_ARCH
;
1092 elf
.e_version
= EV_CURRENT
;
1094 elf
.e_phoff
= sizeof(elf
);
1097 elf
.e_ehsize
= sizeof(elf
);
1098 elf
.e_phentsize
= sizeof(struct elf_phdr
);
1099 elf
.e_phnum
= segs
+1; /* Include notes */
1100 elf
.e_shentsize
= 0;
1108 current
->flags
|= PF_DUMPCORE
;
1110 DUMP_WRITE(&elf
, sizeof(elf
));
1111 offset
+= sizeof(elf
); /* Elf header */
1112 offset
+= (segs
+1) * sizeof(struct elf_phdr
); /* Program headers */
1115 * Set up the notes in similar form to SVR4 core dumps made
1116 * with info from their /proc.
1118 memset(&psinfo
, 0, sizeof(psinfo
));
1119 memset(&prstatus
, 0, sizeof(prstatus
));
1121 notes
[0].name
= "CORE";
1122 notes
[0].type
= NT_PRSTATUS
;
1123 notes
[0].datasz
= sizeof(prstatus
);
1124 notes
[0].data
= &prstatus
;
1125 prstatus
.pr_info
.si_signo
= prstatus
.pr_cursig
= signr
;
1126 prstatus
.pr_sigpend
= current
->signal
.sig
[0];
1127 prstatus
.pr_sighold
= current
->blocked
.sig
[0];
1128 psinfo
.pr_pid
= prstatus
.pr_pid
= current
->pid
;
1129 psinfo
.pr_ppid
= prstatus
.pr_ppid
= current
->p_pptr
->pid
;
1130 psinfo
.pr_pgrp
= prstatus
.pr_pgrp
= current
->pgrp
;
1131 psinfo
.pr_sid
= prstatus
.pr_sid
= current
->session
;
1132 prstatus
.pr_utime
.tv_sec
= CT_TO_SECS(current
->times
.tms_utime
);
1133 prstatus
.pr_utime
.tv_usec
= CT_TO_USECS(current
->times
.tms_utime
);
1134 prstatus
.pr_stime
.tv_sec
= CT_TO_SECS(current
->times
.tms_stime
);
1135 prstatus
.pr_stime
.tv_usec
= CT_TO_USECS(current
->times
.tms_stime
);
1136 prstatus
.pr_cutime
.tv_sec
= CT_TO_SECS(current
->times
.tms_cutime
);
1137 prstatus
.pr_cutime
.tv_usec
= CT_TO_USECS(current
->times
.tms_cutime
);
1138 prstatus
.pr_cstime
.tv_sec
= CT_TO_SECS(current
->times
.tms_cstime
);
1139 prstatus
.pr_cstime
.tv_usec
= CT_TO_USECS(current
->times
.tms_cstime
);
1142 * This transfers the registers from regs into the standard
1143 * coredump arrangement, whatever that is.
1145 #ifdef ELF_CORE_COPY_REGS
1146 ELF_CORE_COPY_REGS(prstatus
.pr_reg
, regs
)
1148 if (sizeof(elf_gregset_t
) != sizeof(struct pt_regs
))
1150 printk("sizeof(elf_gregset_t) (%ld) != sizeof(struct pt_regs) (%ld)\n",
1151 (long)sizeof(elf_gregset_t
), (long)sizeof(struct pt_regs
));
1154 *(struct pt_regs
*)&prstatus
.pr_reg
= *regs
;
1158 dump_regs("Passed in regs", (elf_greg_t
*)regs
);
1159 dump_regs("prstatus regs", (elf_greg_t
*)&prstatus
.pr_reg
);
1162 notes
[1].name
= "CORE";
1163 notes
[1].type
= NT_PRPSINFO
;
1164 notes
[1].datasz
= sizeof(psinfo
);
1165 notes
[1].data
= &psinfo
;
1166 i
= current
->state
? ffz(~current
->state
) + 1 : 0;
1167 psinfo
.pr_state
= i
;
1168 psinfo
.pr_sname
= (i
< 0 || i
> 5) ? '.' : "RSDZTD"[i
];
1169 psinfo
.pr_zomb
= psinfo
.pr_sname
== 'Z';
1170 psinfo
.pr_nice
= current
->priority
-15;
1171 psinfo
.pr_flag
= current
->flags
;
1172 psinfo
.pr_uid
= current
->uid
;
1173 psinfo
.pr_gid
= current
->gid
;
1179 len
= current
->mm
->arg_end
- current
->mm
->arg_start
;
1180 if (len
>= ELF_PRARGSZ
)
1181 len
= ELF_PRARGSZ
-1;
1182 copy_from_user(&psinfo
.pr_psargs
,
1183 (const char *)current
->mm
->arg_start
, len
);
1184 for(i
= 0; i
< len
; i
++)
1185 if (psinfo
.pr_psargs
[i
] == 0)
1186 psinfo
.pr_psargs
[i
] = ' ';
1187 psinfo
.pr_psargs
[len
] = 0;
1191 strncpy(psinfo
.pr_fname
, current
->comm
, sizeof(psinfo
.pr_fname
));
1193 notes
[2].name
= "CORE";
1194 notes
[2].type
= NT_TASKSTRUCT
;
1195 notes
[2].datasz
= sizeof(*current
);
1196 notes
[2].data
= current
;
1198 /* Try to dump the FPU. */
1199 prstatus
.pr_fpvalid
= dump_fpu (regs
, &fpu
);
1200 if (!prstatus
.pr_fpvalid
)
1206 notes
[3].name
= "CORE";
1207 notes
[3].type
= NT_PRFPREG
;
1208 notes
[3].datasz
= sizeof(fpu
);
1209 notes
[3].data
= &fpu
;
1212 /* Write notes phdr entry */
1214 struct elf_phdr phdr
;
1217 for(i
= 0; i
< numnote
; i
++)
1218 sz
+= notesize(¬es
[i
]);
1220 phdr
.p_type
= PT_NOTE
;
1221 phdr
.p_offset
= offset
;
1229 offset
+= phdr
.p_filesz
;
1230 DUMP_WRITE(&phdr
, sizeof(phdr
));
1233 /* Page-align dumped data */
1234 dataoff
= offset
= roundup(offset
, ELF_EXEC_PAGESIZE
);
1236 /* Write program headers for segments dump */
1237 for(vma
= current
->mm
->mmap
, i
= 0;
1238 i
< segs
&& vma
!= NULL
; vma
= vma
->vm_next
) {
1239 struct elf_phdr phdr
;
1244 sz
= vma
->vm_end
- vma
->vm_start
;
1246 phdr
.p_type
= PT_LOAD
;
1247 phdr
.p_offset
= offset
;
1248 phdr
.p_vaddr
= vma
->vm_start
;
1250 phdr
.p_filesz
= maydump(vma
) ? sz
: 0;
1252 offset
+= phdr
.p_filesz
;
1253 phdr
.p_flags
= vma
->vm_flags
& VM_READ
? PF_R
: 0;
1254 if (vma
->vm_flags
& VM_WRITE
) phdr
.p_flags
|= PF_W
;
1255 if (vma
->vm_flags
& VM_EXEC
) phdr
.p_flags
|= PF_X
;
1256 phdr
.p_align
= ELF_EXEC_PAGESIZE
;
1258 DUMP_WRITE(&phdr
, sizeof(phdr
));
1261 for(i
= 0; i
< numnote
; i
++)
1262 if (!writenote(¬es
[i
], file
))
1269 for(i
= 0, vma
= current
->mm
->mmap
;
1270 i
< segs
&& vma
!= NULL
;
1271 vma
= vma
->vm_next
) {
1272 unsigned long addr
= vma
->vm_start
;
1273 unsigned long len
= vma
->vm_end
- vma
->vm_start
;
1279 printk("elf_core_dump: writing %08lx %lx\n", addr
, len
);
1281 DUMP_WRITE((void *)addr
, len
);
1284 if ((off_t
) file
->f_pos
!= offset
) {
1286 printk("elf_core_dump: file->f_pos (%ld) != offset (%ld)\n",
1287 (off_t
) file
->f_pos
, offset
);
1292 #ifndef CONFIG_BINFMT_ELF
1297 #endif /* USE_ELF_CORE_DUMP */
1299 int __init
init_elf_binfmt(void)
1301 return register_binfmt(&elf_format
);
1306 int init_module(void)
1308 /* Install the COFF, ELF and XOUT loaders.
1309 * N.B. We *rely* on the table being the right size with the
1310 * right number of free slots...
1312 return init_elf_binfmt();
1316 void cleanup_module( void)
1318 /* Remove the COFF and ELF loaders. */
1319 unregister_binfmt(&elf_format
);