diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ldso/dynlink.c | 11 | 
1 files changed, 11 insertions, 0 deletions
| diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c index 35ff9626..305d70e0 100644 --- a/src/ldso/dynlink.c +++ b/src/ldso/dynlink.c @@ -493,6 +493,9 @@ void *dlopen(const char *file, int mode)  	if (setjmp(rtld_fail)) {  		/* Clean up anything new that was (partially) loaded */ +		if (p->deps) for (i=0; p->deps[i]; i++) +			if (p->deps[i]->global < 0) +				p->deps[i]->global = 0;  		for (p=orig_tail->next; p; p=next) {  			next = p->next;  			munmap(p->map, p->map_len); @@ -511,7 +514,15 @@ void *dlopen(const char *file, int mode)  	/* First load handling */  	if (!p->deps) {  		load_deps(p); +		for (i=0; p->deps[i]; i++) +			if (!p->deps[i]->global) +				p->deps[i]->global = -1; +		if (!p->global) p->global = -1;  		reloc_all(p); +		for (i=0; p->deps[i]; i++) +			if (p->deps[i]->global < 0) +				p->deps[i]->global = 0; +		if (p->global < 0) p->global = 0;  	}  	if (mode & RTLD_GLOBAL) { | 
