--- linux/fs/binfmt_elf.c.~2~ Sat May 27 13:45:50 1995 +++ linux/fs/binfmt_elf.c Mon Jun 12 22:55:07 1995 @@ -135,7 +135,9 @@ int old_fs, retval; unsigned int last_bss; int error; - int i, k; + int i; + int mmap_flags; + unsigned int k; elf_bss = 0; last_bss = 0; @@ -170,19 +172,21 @@ file = current->filp[elf_exec_fileno]; eppnt = elf_phdata; + mmap_flags = MAP_PRIVATE | MAP_DENYWRITE | (interp_elf_ex->e_type == ET_EXEC ? MAP_FIXED : 0); for(i=0; ie_phnum; i++, eppnt++) if(eppnt->p_type == PT_LOAD) { error = do_mmap(file, - eppnt->p_vaddr & 0xfffff000, + load_addr + (eppnt->p_vaddr & 0xfffff000), eppnt->p_filesz + (eppnt->p_vaddr & 0xfff), ((eppnt->p_flags & PF_R ? PROT_READ : 0) | (eppnt->p_flags & PF_W ? PROT_WRITE : 0) | (eppnt->p_flags & PF_X ? PROT_EXEC : 0)), - MAP_PRIVATE | MAP_DENYWRITE | (interp_elf_ex->e_type == ET_EXEC ? MAP_FIXED : 0), + mmap_flags, eppnt->p_offset & 0xfffff000); if(!load_addr && interp_elf_ex->e_type == ET_DYN) load_addr = error; + mmap_flags |= MAP_FIXED; k = load_addr + eppnt->p_vaddr + eppnt->p_filesz; if(k > elf_bss) elf_bss = k; if(error < 0 && error > -1024) break; /* Real error */