--- imgact_pecoff.c.org Tue Sep 5 18:41:56 2000 +++ imgact_pecoff.c Thu Sep 7 23:09:13 2000 @@ -110,14 +110,14 @@ static int exec_win32_coff_makecmds(struct image_params *, struct coff_filehdr *, int); -win32_signature(struct proc *,struct vnode *, struct win32_dos_filehdr *); +static int win32_signature(struct proc *,struct vnode *, struct win32_dos_filehdr *); static int win32_read_from(struct proc *, struct vnode *,int, caddr_t,int); static int win32_load_section (struct proc *p, struct vmspace *vmspace, struct vnode *vp, vm_offset_t offset, caddr_t vmaddr, size_t memsz, size_t filsz, vm_prot_t prot); -static pecoff_fixup(register_t **stack_base,struct image_params *imgp) +static int pecoff_fixup(register_t **stack_base,struct image_params *imgp) { int len = sizeof(struct win32_args); struct win32_imghdr *ap; @@ -151,7 +151,8 @@ fill_regs(p,®s); #if 1 printf("EIP%x\n",regs.r_eip); - printf("ECX%x\n",regs.r_ecx); + printf("EAX%x EBX%x ECX%x EDI%x\n", + regs.r_eax, regs.r_ebx, regs.r_ecx, regs.r_edi); map=&vm->vm_map; ent=&map->header; printf("%p %p %p\n",ent,ent->prev,ent->next); @@ -170,7 +171,8 @@ return (error); } -win32_load_section(struct proc *p, struct vmspace *vmspace, struct vnode *vp, vm_offset_t offset, caddr_t vmaddr, size_t memsz, size_t filsz, vm_prot_t prot) + +static int win32_load_section(struct proc *p, struct vmspace *vmspace, struct vnode *vp, vm_offset_t offset, caddr_t vmaddr, size_t memsz, size_t filsz, vm_prot_t prot) { size_t map_len; vm_offset_t map_addr; @@ -355,10 +357,15 @@ continue; if ((sh[i].s_flags & (COFF_STYP_TEXT|COFF_STYP_DATA|COFF_STYP_BSS)) == 0) continue; + + prot|=(sh[i].s_flags&COFF_STYP_READ)?VM_PROT_READ:0; + prot|=(sh[i].s_flags&COFF_STYP_WRITE)?VM_PROT_WRITE:0; + prot|=(sh[i].s_flags&COFF_STYP_EXEC)?VM_PROT_EXECUTE:0; + sh[i].s_vaddr += wp->w_base; /* RVA --> VA */ if(win32_load_section(p, vmspace,imgp->vp,sh[i].s_scnptr ,(caddr_t)sh[i].s_vaddr, - sh[i].s_size,sh[i].s_size + sh[i].s_paddr,sh[i].s_size ,prot)!=0) goto fail; @@ -367,8 +374,8 @@ *addr = wp->w_base; *ldexport = wp->w_imghdr[0].i_vaddr + wp->w_base; fail: - free(fp,M_TEMP); - free(sh,M_TEMP); + if (fp) free(fp,M_TEMP); + if (sh) free(sh,M_TEMP); if (nd.ni_vp) vrele(nd.ni_vp); printf("makecmd_error:%d\n",error); @@ -413,15 +420,16 @@ exec_new_vmspace(imgp); vmspace=imgp->proc->p_vmspace; for(i=0;if_nscns;i++){ - prot=(sh[i].s_flags&COFF_STYP_READ)?VM_PROT_READ:0; + prot = VM_PROT_WRITE; /* XXX for relocation? */ + prot|=(sh[i].s_flags&COFF_STYP_READ)?VM_PROT_READ:0; prot|=(sh[i].s_flags&COFF_STYP_WRITE)?VM_PROT_WRITE:0; - prot|=(sh[i].s_flags&COFF_STYP_WRITE)?VM_PROT_EXECUTE:0; + prot|=(sh[i].s_flags&COFF_STYP_EXEC)?VM_PROT_EXECUTE:0; sh[i].s_vaddr += wp->w_base; if(sh[i].s_flags&COFF_STYP_DISCARD) continue; if((sh[i].s_flags&COFF_STYP_TEXT) != 0){ if(win32_load_section(imgp->proc,vmspace,imgp->vp,sh[i].s_scnptr - ,(caddr_t)sh[i].s_vaddr,sh[i].s_size,sh[i].s_size + ,(caddr_t)sh[i].s_vaddr,sh[i].s_paddr,sh[i].s_size ,prot)!=0) goto fail; text_addr = trunc_page(sh[i].s_vaddr); @@ -431,7 +439,7 @@ if((sh[i].s_flags & COFF_STYP_DATA) != 0){ if(win32_load_section(imgp->proc, vmspace,imgp->vp,sh[i].s_scnptr - ,(caddr_t)sh[i].s_vaddr,sh[i].s_size,sh[i].s_size, + ,(caddr_t)sh[i].s_vaddr,sh[i].s_paddr,sh[i].s_size, prot)!=0) goto fail; data_addr = min(trunc_page(sh[i].s_vaddr),data_addr);