diff options
author | peter <peter@FreeBSD.org> | 2003-09-25 01:10:26 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 2003-09-25 01:10:26 +0000 |
commit | 8ecb3577d83113cde0885b76799ccebb323abf8b (patch) | |
tree | f89d7e04e53ed33050987a5b51945ab490d9ba4d /sys/kern/imgact_elf.c | |
parent | 100e3b7635a597fd1f017e000172234099e518e9 (diff) | |
download | FreeBSD-src-8ecb3577d83113cde0885b76799ccebb323abf8b.zip FreeBSD-src-8ecb3577d83113cde0885b76799ccebb323abf8b.tar.gz |
Add sysentvec->sv_fixlimits() hook so that we can catch cases on 64 bit
systems where the data/stack/etc limits are too big for a 32 bit process.
Move the 5 or so identical instances of ELF_RTLD_ADDR() into imgact_elf.c.
Supply an ia32_fixlimits function. Export the clip/default values to
sysctl under the compat.ia32 heirarchy.
Have mmap(0, ...) respect the current p->p_limits[RLIMIT_DATA].rlim_max
value rather than the sysctl tweakable variable. This allows mmap to
place mappings at sensible locations when limits have been reduced.
Have the imgact_elf.c ld-elf.so.1 placement algorithm use the same
method as mmap(0, ...) now does.
Note that we cannot remove all references to the sysctl tweakable
maxdsiz etc variables because /etc/login.conf specifies a datasize
of 'unlimited'. And that causes exec etc to fail since it can no
longer find space to mmap things.
Diffstat (limited to 'sys/kern/imgact_elf.c')
-rw-r--r-- | sys/kern/imgact_elf.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c index 349078b..330437a 100644 --- a/sys/kern/imgact_elf.c +++ b/sys/kern/imgact_elf.c @@ -806,7 +806,14 @@ __CONCAT(exec_, __elfN(imgact))(struct image_params *imgp) vmspace->vm_dsize = data_size >> PAGE_SHIFT; vmspace->vm_daddr = (caddr_t)(uintptr_t)data_addr; - addr = ELF_RTLD_ADDR(vmspace); + /* + * We load the dynamic linker where a userland call + * to mmap(0, ...) would put it. The rationale behind this + * calculation is that it leaves room for the heap to grow to + * its maximum allowed size. + */ + addr = round_page((vm_offset_t)imgp->proc->p_vmspace->vm_daddr + + imgp->proc->p_rlimit[RLIMIT_DATA].rlim_max); imgp->entry_addr = entry; |