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]); |