diff options
| -rw-r--r-- | ldso/libdl/libdl.c | 8 | 
1 files changed, 6 insertions, 2 deletions
diff --git a/ldso/libdl/libdl.c b/ldso/libdl/libdl.c index f34f78152..d102a48ab 100644 --- a/ldso/libdl/libdl.c +++ b/ldso/libdl/libdl.c @@ -790,7 +790,7 @@ static int do_dlclose(void *vhandle, int need_fini)  	int (*dl_elf_fini) (void);  	void (*dl_brk) (void);  	struct dyn_elf *handle; -	unsigned int end; +	ElfW(Addr) end = 0, start = (ElfW(Addr))(~0ULL);  	unsigned int i, j;  	struct r_scope_elem *ls, *ls_next = NULL;  	struct elf_resolve **handle_rlist; @@ -867,6 +867,8 @@ static int do_dlclose(void *vhandle, int need_fini)  					i < tpnt->n_phent; ppnt++, i++) {  				if (ppnt->p_type != PT_LOAD)  					continue; +				if (ppnt->p_vaddr < start) +					start = ppnt->p_vaddr;  				if (end < ppnt->p_vaddr + ppnt->p_memsz)  					end = ppnt->p_vaddr + ppnt->p_memsz;  			} @@ -973,7 +975,9 @@ static int do_dlclose(void *vhandle, int need_fini)  			}  #endif -			DL_LIB_UNMAP (tpnt, end - tpnt->mapaddr); +			end = (end + ADDR_ALIGN) & PAGE_ALIGN; +			start = start & ~ADDR_ALIGN; +			DL_LIB_UNMAP (tpnt, end - start);  			/* Free elements in RTLD_LOCAL scope list */  			for (runp = tpnt->rtld_local; runp; runp = tmp) {  				tmp = runp->next;  | 
