diff options
| -rw-r--r-- | ldso/dynlink.c | 7 | 
1 files changed, 4 insertions, 3 deletions
diff --git a/ldso/dynlink.c b/ldso/dynlink.c index 35a90aef..4b4841f9 100644 --- a/ldso/dynlink.c +++ b/ldso/dynlink.c @@ -725,7 +725,6 @@ done_mapping:  	dso->base = base;  	dso->dynv = laddr(dso, dyn);  	if (dso->tls.size) dso->tls.image = laddr(dso, tls_image); -	if (!runtime) reclaim_gaps(dso);  	free(allocated_buf);  	return map;  noexec: @@ -1044,6 +1043,10 @@ static struct dso *load_library(const char *name, struct dso *needed_by)  		unmap_library(&temp_dso);  		return load_library("libc.so", needed_by);  	} +	/* Past this point, if we haven't reached runtime yet, ldso has +	 * committed either to use the mapped library or to abort execution. +	 * Unmapping is not possible, so we can safely reclaim gaps. */ +	if (!runtime) reclaim_gaps(&temp_dso);  	/* Allocate storage for the new DSO. When there is TLS, this  	 * storage must include a reservation for all pre-existing @@ -1545,13 +1548,11 @@ _Noreturn void __dls3(size_t *sp)  			dprintf(2, "%s: cannot load %s: %s\n", ldname, argv[0], strerror(errno));  			_exit(1);  		} -		runtime = 1;  		Ehdr *ehdr = (void *)map_library(fd, &app);  		if (!ehdr) {  			dprintf(2, "%s: %s: Not a valid dynamic program\n", ldname, argv[0]);  			_exit(1);  		} -		runtime = 0;  		close(fd);  		ldso.name = ldname;  		app.name = argv[0];  | 
