process DT_RELR relocations in ldso-startup/static-pie
authorRich Felker <dalias@aerifal.cx>
Mon, 12 Sep 2022 12:30:36 +0000 (08:30 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 12 Sep 2022 12:30:36 +0000 (08:30 -0400)
commit d32dadd60efb9d3b255351a3b532f8e4c3dd0db1 added DT_RELR
processing for programs and shared libraries processed by the dynamic
linker, but left them unsupported in the dynamic linker itseld and in
static pie binaries, which self-relocate via code in dlstart.c.

add the equivalent processing to this code path so that there are not
arbitrary restrictions on where the new packed relative relocation
form can be used.

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;