1 /* This is the Linux kernel elf-loading code, ported into user space */
18 #define ELF_START_MMAP 0x80000000
21 * This is used to ensure we don't load something for the wrong architecture.
23 #define elf_check_arch(x) ( ((x) == EM_386) || ((x) == EM_486) )
26 * These are used to set parameters in the core dumps.
28 #define ELF_CLASS ELFCLASS32
29 #define ELF_DATA ELFDATA2LSB
30 #define ELF_ARCH EM_386
32 /* SVR4/i386 ABI (pages 3-31, 3-32) says that when the program
33 starts %edx contains a pointer to a function which might be
34 registered using `atexit'. This provides a mean for the
35 dynamic linker to call DT_FINI functions for shared libraries
36 that have been loaded before the code runs.
38 A value of 0 tells we have no such handler. */
39 #define ELF_PLAT_INIT(_r) _r->edx = 0
41 static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
43 regs->esp = infop->start_stack;
44 regs->eip = infop->entry;
47 #define USE_ELF_CORE_DUMP
48 #define ELF_EXEC_PAGESIZE 4096
54 #define ELF_START_MMAP 0x80000000
56 #define elf_check_arch(x) ( (x) == EM_ARM )
58 #define ELF_CLASS ELFCLASS32
59 #ifdef TARGET_WORDS_BIGENDIAN
60 #define ELF_DATA ELFDATA2MSB
62 #define ELF_DATA ELFDATA2LSB
64 #define ELF_ARCH EM_ARM
66 #define ELF_PLAT_INIT(_r) _r->ARM_r0 = 0
68 static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
70 target_long *stack = (void *)infop->start_stack;
71 memset(regs, 0, sizeof(*regs));
72 regs->ARM_cpsr = 0x10;
73 regs->ARM_pc = infop->entry;
74 regs->ARM_sp = infop->start_stack;
75 regs->ARM_r2 = tswapl(stack[2]); /* envp */
76 regs->ARM_r1 = tswapl(stack[1]); /* argv */
77 /* XXX: it seems that r0 is zeroed after ! */
78 // regs->ARM_r0 = tswapl(stack[0]); /* argc */
81 #define USE_ELF_CORE_DUMP
82 #define ELF_EXEC_PAGESIZE 4096
88 #define ELF_START_MMAP 0x80000000
90 #define elf_check_arch(x) ( (x) == EM_SPARC )
92 #define ELF_CLASS ELFCLASS32
93 #define ELF_DATA ELFDATA2MSB
94 #define ELF_ARCH EM_SPARC
97 #define ELF_PLAT_INIT(_r)
99 static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
102 regs->pc = infop->entry;
103 regs->npc = regs->pc + 4;
105 regs->u_regs[14] = infop->start_stack - 16 * 4;
112 #define ELF_START_MMAP 0x80000000
114 #define elf_check_arch(x) ( (x) == EM_PPC )
116 #define ELF_CLASS ELFCLASS32
117 #ifdef TARGET_WORDS_BIGENDIAN
118 #define ELF_DATA ELFDATA2MSB
120 #define ELF_DATA ELFDATA2LSB
122 #define ELF_ARCH EM_PPC
124 /* Note that isn't exactly what regular kernel does
125 * but this is what the ABI wants and is needed to allow
126 * execution of PPC BSD programs.
128 #define ELF_PLAT_INIT(_r) \
130 unsigned long *pos = (unsigned long *)bprm->p, tmp = 1; \
131 _r->gpr[3] = bprm->argc; \
132 _r->gpr[4] = (unsigned long)++pos; \
133 for (; tmp != 0; pos++) \
135 _r->gpr[5] = (unsigned long)pos; \
139 * We need to put in some extra aux table entries to tell glibc what
140 * the cache block size is, so it can use the dcbz instruction safely.
142 #define AT_DCACHEBSIZE 19
143 #define AT_ICACHEBSIZE 20
144 #define AT_UCACHEBSIZE 21
145 /* A special ignored type value for PPC, for glibc compatibility. */
146 #define AT_IGNOREPPC 22
148 * The requirements here are:
149 * - keep the final alignment of sp (sp & 0xf)
150 * - make sure the 32-bit value at the first 16 byte aligned position of
151 * AUXV is greater than 16 for glibc compatibility.
152 * AT_IGNOREPPC is used for that.
153 * - for compatibility with glibc ARCH_DLINFO must always be defined on PPC,
154 * even if DLINFO_ARCH_ITEMS goes to zero or is undefined.
156 #define DLINFO_ARCH_ITEMS 3
157 #define ARCH_DLINFO \
159 sp -= DLINFO_ARCH_ITEMS * 2; \
160 NEW_AUX_ENT(0, AT_DCACHEBSIZE, 0x20); \
161 NEW_AUX_ENT(1, AT_ICACHEBSIZE, 0x20); \
162 NEW_AUX_ENT(2, AT_UCACHEBSIZE, 0); \
164 * Now handle glibc compatibility. \
167 NEW_AUX_ENT(0, AT_IGNOREPPC, AT_IGNOREPPC); \
168 NEW_AUX_ENT(1, AT_IGNOREPPC, AT_IGNOREPPC); \
171 static inline void init_thread(struct target_pt_regs *_regs, struct image_info *infop)
173 _regs->msr = 1 << MSR_PR; /* Set user mode */
174 _regs->gpr[1] = infop->start_stack;
175 _regs->nip = infop->entry;
178 #define USE_ELF_CORE_DUMP
179 #define ELF_EXEC_PAGESIZE 4096
186 * MAX_ARG_PAGES defines the number of pages allocated for arguments
187 * and envelope for the new program. 32 should suffice, this gives
188 * a maximum env+arg of 128kB w/4KB pages!
190 #define MAX_ARG_PAGES 32
193 * This structure is used to hold the arguments that are
194 * used when loading binaries.
196 struct linux_binprm {
198 unsigned long page[MAX_ARG_PAGES];
204 char * filename; /* Name of binary */
205 unsigned long loader, exec;
206 int dont_iput; /* binfmt handler has put inode */
211 unsigned int a_info; /* Use macros N_MAGIC, etc for access */
212 unsigned int a_text; /* length of text, in bytes */
213 unsigned int a_data; /* length of data, in bytes */
214 unsigned int a_bss; /* length of uninitialized data area, in bytes */
215 unsigned int a_syms; /* length of symbol table data in file, in bytes */
216 unsigned int a_entry; /* start address */
217 unsigned int a_trsize; /* length of relocation info for text, in bytes */
218 unsigned int a_drsize; /* length of relocation info for data, in bytes */
222 #define N_MAGIC(exec) ((exec).a_info & 0xffff)
228 /* max code+data+bss space allocated to elf interpreter */
229 #define INTERP_MAP_SIZE (32 * 1024 * 1024)
231 /* max code+data+bss+brk space allocated to ET_DYN executables */
232 #define ET_DYN_MAP_SIZE (128 * 1024 * 1024)
234 /* from personality.h */
236 /* Flags for bug emulation. These occupy the top three bytes. */
237 #define STICKY_TIMEOUTS 0x4000000
238 #define WHOLE_SECONDS 0x2000000
240 /* Personality types. These go in the low byte. Avoid using the top bit,
241 * it will conflict with error returns.
243 #define PER_MASK (0x00ff)
244 #define PER_LINUX (0x0000)
245 #define PER_SVR4 (0x0001 | STICKY_TIMEOUTS)
246 #define PER_SVR3 (0x0002 | STICKY_TIMEOUTS)
247 #define PER_SCOSVR3 (0x0003 | STICKY_TIMEOUTS | WHOLE_SECONDS)
248 #define PER_WYSEV386 (0x0004 | STICKY_TIMEOUTS)
249 #define PER_ISCR4 (0x0005 | STICKY_TIMEOUTS)
250 #define PER_BSD (0x0006)
251 #define PER_XENIX (0x0007 | STICKY_TIMEOUTS)
253 /* Necessary parameters */
256 #define TARGET_ELF_EXEC_PAGESIZE TARGET_PAGE_SIZE
257 #define TARGET_ELF_PAGESTART(_v) ((_v) & ~(unsigned long)(TARGET_ELF_EXEC_PAGESIZE-1))
258 #define TARGET_ELF_PAGEOFFSET(_v) ((_v) & (TARGET_ELF_EXEC_PAGESIZE-1))
260 #define INTERPRETER_NONE 0
261 #define INTERPRETER_AOUT 1
262 #define INTERPRETER_ELF 2
264 #define DLINFO_ITEMS 11
266 #define put_user(x,ptr) (void)(*(ptr) = (typeof(*ptr))(x))
267 #define get_user(ptr) (typeof(*ptr))(*(ptr))
269 static inline void memcpy_fromfs(void * to, const void * from, unsigned long n)
274 static inline void memcpy_tofs(void * to, const void * from, unsigned long n)
279 extern unsigned long x86_stack_size;
281 static int load_aout_interp(void * exptr, int interp_fd);
284 static void bswap_ehdr(Elf32_Ehdr *ehdr)
286 bswap16s(&ehdr->e_type); /* Object file type */
287 bswap16s(&ehdr->e_machine); /* Architecture */
288 bswap32s(&ehdr->e_version); /* Object file version */
289 bswap32s(&ehdr->e_entry); /* Entry point virtual address */
290 bswap32s(&ehdr->e_phoff); /* Program header table file offset */
291 bswap32s(&ehdr->e_shoff); /* Section header table file offset */
292 bswap32s(&ehdr->e_flags); /* Processor-specific flags */
293 bswap16s(&ehdr->e_ehsize); /* ELF header size in bytes */
294 bswap16s(&ehdr->e_phentsize); /* Program header table entry size */
295 bswap16s(&ehdr->e_phnum); /* Program header table entry count */
296 bswap16s(&ehdr->e_shentsize); /* Section header table entry size */
297 bswap16s(&ehdr->e_shnum); /* Section header table entry count */
298 bswap16s(&ehdr->e_shstrndx); /* Section header string table index */
301 static void bswap_phdr(Elf32_Phdr *phdr)
303 bswap32s(&phdr->p_type); /* Segment type */
304 bswap32s(&phdr->p_offset); /* Segment file offset */
305 bswap32s(&phdr->p_vaddr); /* Segment virtual address */
306 bswap32s(&phdr->p_paddr); /* Segment physical address */
307 bswap32s(&phdr->p_filesz); /* Segment size in file */
308 bswap32s(&phdr->p_memsz); /* Segment size in memory */
309 bswap32s(&phdr->p_flags); /* Segment flags */
310 bswap32s(&phdr->p_align); /* Segment alignment */
313 static void bswap_shdr(Elf32_Shdr *shdr)
315 bswap32s(&shdr->sh_name);
316 bswap32s(&shdr->sh_type);
317 bswap32s(&shdr->sh_flags);
318 bswap32s(&shdr->sh_addr);
319 bswap32s(&shdr->sh_offset);
320 bswap32s(&shdr->sh_size);
321 bswap32s(&shdr->sh_link);
322 bswap32s(&shdr->sh_info);
323 bswap32s(&shdr->sh_addralign);
324 bswap32s(&shdr->sh_entsize);
327 static void bswap_sym(Elf32_Sym *sym)
329 bswap32s(&sym->st_name);
330 bswap32s(&sym->st_value);
331 bswap32s(&sym->st_size);
332 bswap16s(&sym->st_shndx);
336 static void * get_free_page(void)
340 /* User-space version of kernel get_free_page. Returns a page-aligned
341 * page-sized chunk of memory.
343 retval = (void *)target_mmap(0, host_page_size, PROT_READ|PROT_WRITE,
344 MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
346 if((long)retval == -1) {
347 perror("get_free_page");
355 static void free_page(void * pageaddr)
357 target_munmap((unsigned long)pageaddr, host_page_size);
361 * 'copy_string()' copies argument/envelope strings from user
362 * memory to free pages in kernel mem. These are in a format ready
363 * to be put directly into the top of new user memory.
366 static unsigned long copy_strings(int argc,char ** argv,unsigned long *page,
369 char *tmp, *tmp1, *pag = NULL;
373 return 0; /* bullet-proofing */
376 if (!(tmp1 = tmp = get_user(argv+argc))) {
377 fprintf(stderr, "VFS: argc is wrong");
380 while (get_user(tmp++));
382 if (p < len) { /* this shouldn't happen - 128kB */
388 offset = p % TARGET_PAGE_SIZE;
389 if (!(pag = (char *) page[p/TARGET_PAGE_SIZE]) &&
390 !(pag = (char *) page[p/TARGET_PAGE_SIZE] =
391 (unsigned long *) get_free_page())) {
395 if (len == 0 || offset == 0) {
396 *(pag + offset) = get_user(tmp);
399 int bytes_to_copy = (len > offset) ? offset : len;
400 tmp -= bytes_to_copy;
402 offset -= bytes_to_copy;
403 len -= bytes_to_copy;
404 memcpy_fromfs(pag + offset, tmp, bytes_to_copy + 1);
411 static int in_group_p(gid_t g)
413 /* return TRUE if we're in the specified group, FALSE otherwise */
416 gid_t grouplist[NGROUPS];
418 ngroup = getgroups(NGROUPS, grouplist);
419 for(i = 0; i < ngroup; i++) {
420 if(grouplist[i] == g) {
427 static int count(char ** vec)
431 for(i = 0; *vec; i++) {
438 static int prepare_binprm(struct linux_binprm *bprm)
442 int retval, id_change;
444 if(fstat(bprm->fd, &st) < 0) {
449 if(!S_ISREG(mode)) { /* Must be regular file */
452 if(!(mode & 0111)) { /* Must have at least one execute bit set */
456 bprm->e_uid = geteuid();
457 bprm->e_gid = getegid();
462 bprm->e_uid = st.st_uid;
463 if(bprm->e_uid != geteuid()) {
470 * If setgid is set but no group execute bit then this
471 * is a candidate for mandatory locking, not a setgid
474 if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
475 bprm->e_gid = st.st_gid;
476 if (!in_group_p(bprm->e_gid)) {
481 memset(bprm->buf, 0, sizeof(bprm->buf));
482 retval = lseek(bprm->fd, 0L, SEEK_SET);
484 retval = read(bprm->fd, bprm->buf, 128);
487 perror("prepare_binprm");
489 /* return(-errno); */
496 unsigned long setup_arg_pages(unsigned long p, struct linux_binprm * bprm,
497 struct image_info * info)
499 unsigned long stack_base, size, error;
502 /* Create enough stack to hold everything. If we don't use
503 * it for args, we'll use it for something else...
505 size = x86_stack_size;
506 if (size < MAX_ARG_PAGES*TARGET_PAGE_SIZE)
507 size = MAX_ARG_PAGES*TARGET_PAGE_SIZE;
508 error = target_mmap(0,
509 size + host_page_size,
510 PROT_READ | PROT_WRITE,
511 MAP_PRIVATE | MAP_ANONYMOUS,
517 /* we reserve one extra page at the top of the stack as guard */
518 target_mprotect(error + size, host_page_size, PROT_NONE);
520 stack_base = error + size - MAX_ARG_PAGES*TARGET_PAGE_SIZE;
524 bprm->loader += stack_base;
526 bprm->exec += stack_base;
528 for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
532 memcpy((void *)stack_base, (void *)bprm->page[i], TARGET_PAGE_SIZE);
533 free_page((void *)bprm->page[i]);
535 stack_base += TARGET_PAGE_SIZE;
540 static void set_brk(unsigned long start, unsigned long end)
542 /* page-align the start and end addresses... */
543 start = HOST_PAGE_ALIGN(start);
544 end = HOST_PAGE_ALIGN(end);
547 if(target_mmap(start, end - start,
548 PROT_READ | PROT_WRITE | PROT_EXEC,
549 MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) == -1) {
550 perror("cannot mmap brk");
556 /* We need to explicitly zero any fractional pages after the data
557 section (i.e. bss). This would contain the junk from the file that
558 should not be in memory. */
559 static void padzero(unsigned long elf_bss)
564 /* XXX: this is really a hack : if the real host page size is
565 smaller than the target page size, some pages after the end
566 of the file may not be mapped. A better fix would be to
567 patch target_mmap(), but it is more complicated as the file
568 size must be known */
569 if (real_host_page_size < host_page_size) {
570 unsigned long end_addr, end_addr1;
571 end_addr1 = (elf_bss + real_host_page_size - 1) &
572 ~(real_host_page_size - 1);
573 end_addr = HOST_PAGE_ALIGN(elf_bss);
574 if (end_addr1 < end_addr) {
575 mmap((void *)end_addr1, end_addr - end_addr1,
576 PROT_READ|PROT_WRITE|PROT_EXEC,
577 MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
581 nbyte = elf_bss & (host_page_size-1);
583 nbyte = host_page_size - nbyte;
584 fpnt = (char *) elf_bss;
591 static unsigned int * create_elf_tables(char *p, int argc, int envc,
592 struct elfhdr * exec,
593 unsigned long load_addr,
594 unsigned long load_bias,
595 unsigned long interp_load_addr, int ibcs,
596 struct image_info *info)
598 target_ulong *argv, *envp;
599 target_ulong *sp, *csp;
602 * Force 16 byte _final_ alignment here for generality.
604 sp = (unsigned int *) (~15UL & (unsigned long) p);
606 csp -= (DLINFO_ITEMS + 1) * 2;
607 #ifdef DLINFO_ARCH_ITEMS
608 csp -= DLINFO_ARCH_ITEMS*2;
612 csp -= (!ibcs ? 3 : 1); /* argc itself */
613 if ((unsigned long)csp & 15UL)
614 sp -= ((unsigned long)csp & 15UL) / sizeof(*sp);
616 #define NEW_AUX_ENT(nr, id, val) \
617 put_user (tswapl(id), sp + (nr * 2)); \
618 put_user (tswapl(val), sp + (nr * 2 + 1))
620 NEW_AUX_ENT (0, AT_NULL, 0);
622 sp -= DLINFO_ITEMS*2;
623 NEW_AUX_ENT( 0, AT_PHDR, (target_ulong)(load_addr + exec->e_phoff));
624 NEW_AUX_ENT( 1, AT_PHENT, (target_ulong)(sizeof (struct elf_phdr)));
625 NEW_AUX_ENT( 2, AT_PHNUM, (target_ulong)(exec->e_phnum));
626 NEW_AUX_ENT( 3, AT_PAGESZ, (target_ulong)(TARGET_PAGE_SIZE));
627 NEW_AUX_ENT( 4, AT_BASE, (target_ulong)(interp_load_addr));
628 NEW_AUX_ENT( 5, AT_FLAGS, (target_ulong)0);
629 NEW_AUX_ENT( 6, AT_ENTRY, load_bias + exec->e_entry);
630 NEW_AUX_ENT( 7, AT_UID, (target_ulong) getuid());
631 NEW_AUX_ENT( 8, AT_EUID, (target_ulong) geteuid());
632 NEW_AUX_ENT( 9, AT_GID, (target_ulong) getgid());
633 NEW_AUX_ENT(11, AT_EGID, (target_ulong) getegid());
636 * ARCH_DLINFO must come last so platform specific code can enforce
637 * special alignment requirements on the AUXV if necessary (eg. PPC).
648 put_user(tswapl((target_ulong)envp),--sp);
649 put_user(tswapl((target_ulong)argv),--sp);
651 put_user(tswapl(argc),--sp);
652 info->arg_start = (unsigned int)((unsigned long)p & 0xffffffff);
654 put_user(tswapl((target_ulong)p),argv++);
655 while (get_user(p++)) /* nothing */ ;
658 info->arg_end = info->env_start = (unsigned int)((unsigned long)p & 0xffffffff);
660 put_user(tswapl((target_ulong)p),envp++);
661 while (get_user(p++)) /* nothing */ ;
664 info->env_end = (unsigned int)((unsigned long)p & 0xffffffff);
670 static unsigned long load_elf_interp(struct elfhdr * interp_elf_ex,
672 unsigned long *interp_load_addr)
674 struct elf_phdr *elf_phdata = NULL;
675 struct elf_phdr *eppnt;
676 unsigned long load_addr = 0;
677 int load_addr_set = 0;
679 unsigned long last_bss, elf_bss;
688 bswap_ehdr(interp_elf_ex);
690 /* First of all, some simple consistency checks */
691 if ((interp_elf_ex->e_type != ET_EXEC &&
692 interp_elf_ex->e_type != ET_DYN) ||
693 !elf_check_arch(interp_elf_ex->e_machine)) {
698 /* Now read in all of the header information */
700 if (sizeof(struct elf_phdr) * interp_elf_ex->e_phnum > TARGET_PAGE_SIZE)
703 elf_phdata = (struct elf_phdr *)
704 malloc(sizeof(struct elf_phdr) * interp_elf_ex->e_phnum);
710 * If the size of this structure has changed, then punt, since
711 * we will be doing the wrong thing.
713 if (interp_elf_ex->e_phentsize != sizeof(struct elf_phdr)) {
718 retval = lseek(interpreter_fd, interp_elf_ex->e_phoff, SEEK_SET);
720 retval = read(interpreter_fd,
722 sizeof(struct elf_phdr) * interp_elf_ex->e_phnum);
725 perror("load_elf_interp");
732 for (i=0; i<interp_elf_ex->e_phnum; i++, eppnt++) {
737 if (interp_elf_ex->e_type == ET_DYN) {
738 /* in order to avoid harcoding the interpreter load
739 address in qemu, we allocate a big enough memory zone */
740 error = target_mmap(0, INTERP_MAP_SIZE,
741 PROT_NONE, MAP_PRIVATE | MAP_ANON,
752 for(i=0; i<interp_elf_ex->e_phnum; i++, eppnt++)
753 if (eppnt->p_type == PT_LOAD) {
754 int elf_type = MAP_PRIVATE | MAP_DENYWRITE;
756 unsigned long vaddr = 0;
759 if (eppnt->p_flags & PF_R) elf_prot = PROT_READ;
760 if (eppnt->p_flags & PF_W) elf_prot |= PROT_WRITE;
761 if (eppnt->p_flags & PF_X) elf_prot |= PROT_EXEC;
762 if (interp_elf_ex->e_type == ET_EXEC || load_addr_set) {
763 elf_type |= MAP_FIXED;
764 vaddr = eppnt->p_vaddr;
766 error = target_mmap(load_addr+TARGET_ELF_PAGESTART(vaddr),
767 eppnt->p_filesz + TARGET_ELF_PAGEOFFSET(eppnt->p_vaddr),
771 eppnt->p_offset - TARGET_ELF_PAGEOFFSET(eppnt->p_vaddr));
773 if (error > -1024UL) {
775 close(interpreter_fd);
780 if (!load_addr_set && interp_elf_ex->e_type == ET_DYN) {
786 * Find the end of the file mapping for this phdr, and keep
787 * track of the largest address we see for this.
789 k = load_addr + eppnt->p_vaddr + eppnt->p_filesz;
790 if (k > elf_bss) elf_bss = k;
793 * Do the same thing for the memory mapping - between
794 * elf_bss and last_bss is the bss section.
796 k = load_addr + eppnt->p_memsz + eppnt->p_vaddr;
797 if (k > last_bss) last_bss = k;
800 /* Now use mmap to map the library into memory. */
802 close(interpreter_fd);
805 * Now fill out the bss section. First pad the last page up
806 * to the page boundary, and then perform a mmap to make sure
807 * that there are zeromapped pages up to and including the last
811 elf_bss = TARGET_ELF_PAGESTART(elf_bss + host_page_size - 1); /* What we have mapped so far */
813 /* Map the last of the bss segment */
814 if (last_bss > elf_bss) {
815 target_mmap(elf_bss, last_bss-elf_bss,
816 PROT_READ|PROT_WRITE|PROT_EXEC,
817 MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
821 *interp_load_addr = load_addr;
822 return ((unsigned long) interp_elf_ex->e_entry) + load_addr;
825 /* Best attempt to load symbols from this ELF object. */
826 static void load_symbols(struct elfhdr *hdr, int fd)
829 struct elf_shdr sechdr, symtab, strtab;
832 lseek(fd, hdr->e_shoff, SEEK_SET);
833 for (i = 0; i < hdr->e_shnum; i++) {
834 if (read(fd, &sechdr, sizeof(sechdr)) != sizeof(sechdr))
839 if (sechdr.sh_type == SHT_SYMTAB) {
841 lseek(fd, hdr->e_shoff
842 + sizeof(sechdr) * sechdr.sh_link, SEEK_SET);
843 if (read(fd, &strtab, sizeof(strtab))
852 return; /* Shouldn't happen... */
855 /* Now know where the strtab and symtab are. Snarf them. */
856 disas_symtab = malloc(symtab.sh_size);
857 disas_strtab = strings = malloc(strtab.sh_size);
858 if (!disas_symtab || !disas_strtab)
861 lseek(fd, symtab.sh_offset, SEEK_SET);
862 if (read(fd, disas_symtab, symtab.sh_size) != symtab.sh_size)
866 for (i = 0; i < symtab.sh_size / sizeof(struct elf_sym); i++)
867 bswap_sym(disas_symtab + sizeof(struct elf_sym)*i);
870 lseek(fd, strtab.sh_offset, SEEK_SET);
871 if (read(fd, strings, strtab.sh_size) != strtab.sh_size)
873 disas_num_syms = symtab.sh_size / sizeof(struct elf_sym);
876 static int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
877 struct image_info * info)
879 struct elfhdr elf_ex;
880 struct elfhdr interp_elf_ex;
881 struct exec interp_ex;
882 int interpreter_fd = -1; /* avoid warning */
883 unsigned long load_addr, load_bias;
884 int load_addr_set = 0;
885 unsigned int interpreter_type = INTERPRETER_NONE;
886 unsigned char ibcs2_interpreter;
888 unsigned long mapped_addr;
889 struct elf_phdr * elf_ppnt;
890 struct elf_phdr *elf_phdata;
891 unsigned long elf_bss, k, elf_brk;
893 char * elf_interpreter;
894 unsigned long elf_entry, interp_load_addr = 0;
896 unsigned long start_code, end_code, end_data;
897 unsigned long elf_stack;
898 char passed_fileno[6];
900 ibcs2_interpreter = 0;
904 elf_ex = *((struct elfhdr *) bprm->buf); /* exec-header */
909 if (elf_ex.e_ident[0] != 0x7f ||
910 strncmp(&elf_ex.e_ident[1], "ELF",3) != 0) {
914 /* First of all, some simple consistency checks */
915 if ((elf_ex.e_type != ET_EXEC && elf_ex.e_type != ET_DYN) ||
916 (! elf_check_arch(elf_ex.e_machine))) {
920 /* Now read in all of the header information */
921 elf_phdata = (struct elf_phdr *)malloc(elf_ex.e_phentsize*elf_ex.e_phnum);
922 if (elf_phdata == NULL) {
926 retval = lseek(bprm->fd, elf_ex.e_phoff, SEEK_SET);
928 retval = read(bprm->fd, (char *) elf_phdata,
929 elf_ex.e_phentsize * elf_ex.e_phnum);
933 perror("load_elf_binary");
940 elf_ppnt = elf_phdata;
941 for (i=0; i<elf_ex.e_phnum; i++, elf_ppnt++) {
942 bswap_phdr(elf_ppnt);
945 elf_ppnt = elf_phdata;
952 elf_interpreter = NULL;
957 for(i=0;i < elf_ex.e_phnum; i++) {
958 if (elf_ppnt->p_type == PT_INTERP) {
959 if ( elf_interpreter != NULL )
962 free(elf_interpreter);
967 /* This is the program interpreter used for
968 * shared libraries - for now assume that this
969 * is an a.out format binary
972 elf_interpreter = (char *)malloc(elf_ppnt->p_filesz);
974 if (elf_interpreter == NULL) {
980 retval = lseek(bprm->fd, elf_ppnt->p_offset, SEEK_SET);
982 retval = read(bprm->fd, elf_interpreter, elf_ppnt->p_filesz);
985 perror("load_elf_binary2");
989 /* If the program interpreter is one of these two,
990 then assume an iBCS2 image. Otherwise assume
991 a native linux image. */
993 /* JRP - Need to add X86 lib dir stuff here... */
995 if (strcmp(elf_interpreter,"/usr/lib/libc.so.1") == 0 ||
996 strcmp(elf_interpreter,"/usr/lib/ld.so.1") == 0) {
997 ibcs2_interpreter = 1;
1001 printf("Using ELF interpreter %s\n", elf_interpreter);
1004 retval = open(path(elf_interpreter), O_RDONLY);
1006 interpreter_fd = retval;
1009 perror(elf_interpreter);
1011 /* retval = -errno; */
1016 retval = lseek(interpreter_fd, 0, SEEK_SET);
1018 retval = read(interpreter_fd,bprm->buf,128);
1022 interp_ex = *((struct exec *) bprm->buf); /* aout exec-header */
1023 interp_elf_ex=*((struct elfhdr *) bprm->buf); /* elf exec-header */
1026 perror("load_elf_binary3");
1029 free(elf_interpreter);
1037 /* Some simple consistency checks for the interpreter */
1038 if (elf_interpreter){
1039 interpreter_type = INTERPRETER_ELF | INTERPRETER_AOUT;
1041 /* Now figure out which format our binary is */
1042 if ((N_MAGIC(interp_ex) != OMAGIC) && (N_MAGIC(interp_ex) != ZMAGIC) &&
1043 (N_MAGIC(interp_ex) != QMAGIC)) {
1044 interpreter_type = INTERPRETER_ELF;
1047 if (interp_elf_ex.e_ident[0] != 0x7f ||
1048 strncmp(&interp_elf_ex.e_ident[1], "ELF",3) != 0) {
1049 interpreter_type &= ~INTERPRETER_ELF;
1052 if (!interpreter_type) {
1053 free(elf_interpreter);
1060 /* OK, we are done with that, now set up the arg stuff,
1061 and then start this sucker up */
1063 if (!bprm->sh_bang) {
1066 if (interpreter_type == INTERPRETER_AOUT) {
1067 sprintf(passed_fileno, "%d", bprm->fd);
1068 passed_p = passed_fileno;
1070 if (elf_interpreter) {
1071 bprm->p = copy_strings(1,&passed_p,bprm->page,bprm->p);
1076 if (elf_interpreter) {
1077 free(elf_interpreter);
1085 /* OK, This is the point of no return */
1088 info->start_mmap = (unsigned long)ELF_START_MMAP;
1090 elf_entry = (unsigned long) elf_ex.e_entry;
1092 /* Do this so that we can load the interpreter, if need be. We will
1093 change some of these later */
1095 bprm->p = setup_arg_pages(bprm->p, bprm, info);
1096 info->start_stack = bprm->p;
1098 /* Now we do a little grungy work by mmaping the ELF image into
1099 * the correct location in memory. At this point, we assume that
1100 * the image should be loaded at fixed address, not at a variable
1104 for(i = 0, elf_ppnt = elf_phdata; i < elf_ex.e_phnum; i++, elf_ppnt++) {
1107 unsigned long error;
1109 if (elf_ppnt->p_type != PT_LOAD)
1112 if (elf_ppnt->p_flags & PF_R) elf_prot |= PROT_READ;
1113 if (elf_ppnt->p_flags & PF_W) elf_prot |= PROT_WRITE;
1114 if (elf_ppnt->p_flags & PF_X) elf_prot |= PROT_EXEC;
1115 elf_flags = MAP_PRIVATE | MAP_DENYWRITE;
1116 if (elf_ex.e_type == ET_EXEC || load_addr_set) {
1117 elf_flags |= MAP_FIXED;
1118 } else if (elf_ex.e_type == ET_DYN) {
1119 /* Try and get dynamic programs out of the way of the default mmap
1120 base, as well as whatever program they might try to exec. This
1121 is because the brk will follow the loader, and is not movable. */
1122 /* NOTE: for qemu, we do a big mmap to get enough space
1123 without harcoding any address */
1124 error = target_mmap(0, ET_DYN_MAP_SIZE,
1125 PROT_NONE, MAP_PRIVATE | MAP_ANON,
1131 load_bias = TARGET_ELF_PAGESTART(error - elf_ppnt->p_vaddr);
1134 error = target_mmap(TARGET_ELF_PAGESTART(load_bias + elf_ppnt->p_vaddr),
1135 (elf_ppnt->p_filesz +
1136 TARGET_ELF_PAGEOFFSET(elf_ppnt->p_vaddr)),
1138 (MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE),
1140 (elf_ppnt->p_offset -
1141 TARGET_ELF_PAGEOFFSET(elf_ppnt->p_vaddr)));
1147 #ifdef LOW_ELF_STACK
1148 if (TARGET_ELF_PAGESTART(elf_ppnt->p_vaddr) < elf_stack)
1149 elf_stack = TARGET_ELF_PAGESTART(elf_ppnt->p_vaddr);
1152 if (!load_addr_set) {
1154 load_addr = elf_ppnt->p_vaddr - elf_ppnt->p_offset;
1155 if (elf_ex.e_type == ET_DYN) {
1156 load_bias += error -
1157 TARGET_ELF_PAGESTART(load_bias + elf_ppnt->p_vaddr);
1158 load_addr += load_bias;
1161 k = elf_ppnt->p_vaddr;
1164 k = elf_ppnt->p_vaddr + elf_ppnt->p_filesz;
1167 if ((elf_ppnt->p_flags & PF_X) && end_code < k)
1171 k = elf_ppnt->p_vaddr + elf_ppnt->p_memsz;
1172 if (k > elf_brk) elf_brk = k;
1175 elf_entry += load_bias;
1176 elf_bss += load_bias;
1177 elf_brk += load_bias;
1178 start_code += load_bias;
1179 end_code += load_bias;
1180 // start_data += load_bias;
1181 end_data += load_bias;
1183 if (elf_interpreter) {
1184 if (interpreter_type & 1) {
1185 elf_entry = load_aout_interp(&interp_ex, interpreter_fd);
1187 else if (interpreter_type & 2) {
1188 elf_entry = load_elf_interp(&interp_elf_ex, interpreter_fd,
1192 close(interpreter_fd);
1193 free(elf_interpreter);
1195 if (elf_entry == ~0UL) {
1196 printf("Unable to load interpreter\n");
1206 load_symbols(&elf_ex, bprm->fd);
1208 if (interpreter_type != INTERPRETER_AOUT) close(bprm->fd);
1209 info->personality = (ibcs2_interpreter ? PER_SVR4 : PER_LINUX);
1211 #ifdef LOW_ELF_STACK
1212 info->start_stack = bprm->p = elf_stack - 4;
1214 bprm->p = (unsigned long)
1215 create_elf_tables((char *)bprm->p,
1219 load_addr, load_bias,
1221 (interpreter_type == INTERPRETER_AOUT ? 0 : 1),
1223 if (interpreter_type == INTERPRETER_AOUT)
1224 info->arg_start += strlen(passed_fileno) + 1;
1225 info->start_brk = info->brk = elf_brk;
1226 info->end_code = end_code;
1227 info->start_code = start_code;
1228 info->end_data = end_data;
1229 info->start_stack = bprm->p;
1231 /* Calling set_brk effectively mmaps the pages that we need for the bss and break
1233 set_brk(elf_bss, elf_brk);
1238 printf("(start_brk) %x\n" , info->start_brk);
1239 printf("(end_code) %x\n" , info->end_code);
1240 printf("(start_code) %x\n" , info->start_code);
1241 printf("(end_data) %x\n" , info->end_data);
1242 printf("(start_stack) %x\n" , info->start_stack);
1243 printf("(brk) %x\n" , info->brk);
1246 if ( info->personality == PER_SVR4 )
1248 /* Why this, you ask??? Well SVr4 maps page 0 as read-only,
1249 and some applications "depend" upon this behavior.
1250 Since we do not have the power to recompile these, we
1251 emulate the SVr4 behavior. Sigh. */
1252 mapped_addr = target_mmap(0, host_page_size, PROT_READ | PROT_EXEC,
1253 MAP_FIXED | MAP_PRIVATE, -1, 0);
1256 #ifdef ELF_PLAT_INIT
1258 * The ABI may specify that certain registers be set up in special
1259 * ways (on i386 %edx is the address of a DT_FINI function, for
1260 * example. This macro performs whatever initialization to
1261 * the regs structure is required.
1263 ELF_PLAT_INIT(regs);
1267 info->entry = elf_entry;
1274 int elf_exec(const char * filename, char ** argv, char ** envp,
1275 struct target_pt_regs * regs, struct image_info *infop)
1277 struct linux_binprm bprm;
1281 bprm.p = TARGET_PAGE_SIZE*MAX_ARG_PAGES-sizeof(unsigned int);
1282 for (i=0 ; i<MAX_ARG_PAGES ; i++) /* clear page-table */
1284 retval = open(filename, O_RDONLY);
1288 /* return retval; */
1293 bprm.filename = (char *)filename;
1298 bprm.argc = count(argv);
1299 bprm.envc = count(envp);
1301 retval = prepare_binprm(&bprm);
1304 bprm.p = copy_strings(1, &bprm.filename, bprm.page, bprm.p);
1306 bprm.p = copy_strings(bprm.envc,envp,bprm.page,bprm.p);
1307 bprm.p = copy_strings(bprm.argc,argv,bprm.page,bprm.p);
1314 retval = load_elf_binary(&bprm,regs,infop);
1317 /* success. Initialize important registers */
1318 init_thread(regs, infop);
1322 /* Something went wrong, return the inode and free the argument pages*/
1323 for (i=0 ; i<MAX_ARG_PAGES ; i++) {
1324 free_page((void *)bprm.page[i]);
1330 static int load_aout_interp(void * exptr, int interp_fd)
1332 printf("a.out interpreter not yet supported\n");