clean up dns_parse_callback
[musl] / ldso / dlstart.c
index 20d50f2..259f5e1 100644 (file)
@@ -140,6 +140,21 @@ hidden void _dlstart_c(size_t *sp, size_t *dynv)
                size_t *rel_addr = (void *)(base + rel[0]);
                *rel_addr = base + rel[2];
        }
+
+       rel = (void *)(base+dyn[DT_RELR]);
+       rel_size = dyn[DT_RELRSZ];
+       size_t *relr_addr = 0;
+       for (; rel_size; rel++, rel_size-=sizeof(size_t)) {
+               if ((rel[0]&1) == 0) {
+                       relr_addr = (void *)(base + rel[0]);
+                       *relr_addr++ += base;
+               } else {
+                       for (size_t i=0, bitmap=rel[0]; bitmap>>=1; i++)
+                               if (bitmap&1)
+                                       relr_addr[i] += base;
+                       relr_addr += 8*sizeof(size_t)-1;
+               }
+       }
 #endif
 
        stage2_func dls2;