diff options
| -rw-r--r-- | src/ldso/dlstart.c | 40 | 
1 files changed, 16 insertions, 24 deletions
| diff --git a/src/ldso/dlstart.c b/src/ldso/dlstart.c index caa974a2..5f84465c 100644 --- a/src/ldso/dlstart.c +++ b/src/ldso/dlstart.c @@ -56,30 +56,22 @@ void _dlstart_c(size_t *sp, size_t *dynv)  		for (i=0; i<local_cnt; i++) got[i] += (size_t)base;  	} -	/* The use of the reloc_info structure and nested loops is a trick -	 * to work around the fact that we can't necessarily make function -	 * calls yet. Each struct in the array serves like the arguments -	 * to a function call. */ -	struct { -		void *rel; -		size_t size; -		size_t stride; -	} reloc_info[] = { -		{ base+dyn[DT_REL], dyn[DT_RELSZ], 2 }, -		{ base+dyn[DT_RELA], dyn[DT_RELASZ], 3 }, -		{ 0, 0, 0 } -	}; - -	for (i=0; reloc_info[i].stride; i++) { -		size_t *rel = reloc_info[i].rel; -		size_t rel_size = reloc_info[i].size; -		size_t stride = reloc_info[i].stride; -		for (; rel_size; rel+=stride, rel_size-=stride*sizeof(size_t)) { -			if (!IS_RELATIVE(rel[1])) continue; -			size_t *rel_addr = (void *)(base + rel[0]); -			size_t addend = stride==3 ? rel[2] : *rel_addr; -			*rel_addr = (size_t)base + addend; -		} +	size_t *rel, rel_size; + +	rel = (void *)(base+dyn[DT_REL]); +	rel_size = dyn[DT_RELSZ]; +	for (; rel_size; rel+=2, rel_size-=2*sizeof(size_t)) { +		if (!IS_RELATIVE(rel[1])) continue; +		size_t *rel_addr = (void *)(base + rel[0]); +		*rel_addr += (size_t)base; +	} + +	rel = (void *)(base+dyn[DT_RELA]); +	rel_size = dyn[DT_RELASZ]; +	for (; rel_size; rel+=3, rel_size-=3*sizeof(size_t)) { +		if (!IS_RELATIVE(rel[1])) continue; +		size_t *rel_addr = (void *)(base + rel[0]); +		*rel_addr = (size_t)base + rel[2];  	}  	const char *strings = (void *)(base + dyn[DT_STRTAB]); | 
