Changeset View
Changeset View
Standalone View
Standalone View
libexec/rtld-elf/map_object.c
Show First 20 Lines • Show All 187 Lines • ▼ Show 20 Lines | goto error; | ||||
*/ | */ | ||||
base_vaddr = trunc_page(segs[0]->p_vaddr); | base_vaddr = trunc_page(segs[0]->p_vaddr); | ||||
base_vlimit = round_page(segs[nsegs]->p_vaddr + segs[nsegs]->p_memsz); | base_vlimit = round_page(segs[nsegs]->p_vaddr + segs[nsegs]->p_memsz); | ||||
mapsize = base_vlimit - base_vaddr; | mapsize = base_vlimit - base_vaddr; | ||||
base_addr = (caddr_t) base_vaddr; | base_addr = (caddr_t) base_vaddr; | ||||
base_flags = MAP_PRIVATE | MAP_ANON | MAP_NOCORE; | base_flags = MAP_PRIVATE | MAP_ANON | MAP_NOCORE; | ||||
if (npagesizes > 1 && round_page(segs[0]->p_filesz) >= pagesizes[1]) | if (npagesizes > 1 && round_page(segs[0]->p_filesz) >= pagesizes[1]) | ||||
base_flags |= MAP_ALIGNED_SUPER; | base_flags |= MAP_ALIGNED_SUPER; | ||||
if (base_vaddr != 0) | |||||
base_flags |= MAP_FIXED | MAP_EXCL; | |||||
mapbase = mmap(base_addr, mapsize, PROT_NONE, base_flags, -1, 0); | mapbase = mmap(base_addr, mapsize, PROT_NONE, base_flags, -1, 0); | ||||
if (mapbase == (caddr_t) -1) { | if (mapbase == (caddr_t) -1) { | ||||
_rtld_error("%s: mmap of entire address space failed: %s", | _rtld_error("%s: mmap of entire address space failed: %s", | ||||
path, rtld_strerror(errno)); | path, rtld_strerror(errno)); | ||||
goto error; | goto error; | ||||
} | } | ||||
if (base_addr != NULL && mapbase != base_addr) { | if (base_addr != NULL && mapbase != base_addr) { | ||||
▲ Show 20 Lines • Show All 269 Lines • Show Last 20 Lines |