1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- From 6f3ead0ae16deb9f0004b275e29a276c9712ee3c Mon Sep 17 00:00:00 2001
- From: Rich Felker <dalias@aerifal.cx>
- Date: Mon, 12 Sep 2022 08:30:36 -0400
- Subject: process DT_RELR relocations in ldso-startup/static-pie
- 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 | 15 +++++++++++++++
- 1 file changed, 15 insertions(+)
- diff --git a/ldso/dlstart.c b/ldso/dlstart.c
- index 20d50f2c..259f5e18 100644
- --- a/ldso/dlstart.c
- +++ b/ldso/dlstart.c
- @@ -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;
- --
- cgit v1.2.1
|