mirror of
git://git.musl-libc.org/musl
synced 2024-12-12 09:45:45 +00:00
process DT_RELR relocations in ldso-startup/static-pie
commit d32dadd60e
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.
This commit is contained in:
parent
25085c85a0
commit
6f3ead0ae1
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user