From 22930c9bf21ea15d0da1477a379029e2de259b69 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Wed, 10 Jan 1996 10:00:22 +0000 Subject: Tue Jan 9 16:10:26 1996 Roland McGrath * elf/dl-load.c (_dl_map_object_from_fd): After mapping first segment to find location, mprotect excess region to no access, don't munmap it. * sysdeps/mach/hurd/dl-sysdep.c (mmap): If vm_map returns KERN_NO_SPACE for fixed location, deallocate it and try again. --- sysdeps/mach/hurd/dl-sysdep.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) (limited to 'sysdeps/mach/hurd/dl-sysdep.c') diff --git a/sysdeps/mach/hurd/dl-sysdep.c b/sysdeps/mach/hurd/dl-sysdep.c index 2d2d360cf2..fece47ba97 100644 --- a/sysdeps/mach/hurd/dl-sysdep.c +++ b/sysdeps/mach/hurd/dl-sysdep.c @@ -1,5 +1,5 @@ /* Operating system support for run-time dynamic linker. Hurd version. -Copyright (C) 1995 Free Software Foundation, Inc. +Copyright (C) 1995, 1996 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -518,6 +518,22 @@ mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t offset) flags & (MAP_COPY|MAP_PRIVATE), vmprot, VM_PROT_ALL, (flags & MAP_SHARED) ? VM_INHERIT_SHARE : VM_INHERIT_COPY); + if (err == KERN_NO_SPACE && (flags & MAP_FIXED)) + { + /* XXX this is not atomic as it is in unix! */ + /* The region is already allocated; deallocate it first. */ + err = __vm_deallocate (__mach_task_self (), mapaddr, len); + if (! err) + err = __vm_map (__mach_task_self (), + &mapaddr, (vm_size_t) len, 0 /*ELF_MACHINE_USER_ADDRESS_MASK*/, + !(flags & MAP_FIXED), + (mach_port_t) fd, (vm_offset_t) offset, + flags & (MAP_COPY|MAP_PRIVATE), + vmprot, VM_PROT_ALL, + (flags & MAP_SHARED) + ? VM_INHERIT_SHARE : VM_INHERIT_COPY); + } + return err ? (caddr_t) __hurd_fail (err) : (caddr_t) mapaddr; } -- cgit v1.2.3