mirror of
https://git.musl-libc.org/git/musl
synced 2025-01-06 23:02:10 +03:00
fix fdpic regression in dynamic linker with overly smart compilers
at least gcc 9 broke execution of DT_INIT/DT_FINI for fdpic archs (presently only sh) by recognizing that the stores to the compound-literal function descriptor constructed to call them were dead stores. there's no way to make a "may_alias function", so instead launder the descriptor through an asm-statement barrier. in practice just making the compound literal volatile seemed to have worked too, but this should be less of a hack and more accurately convey the semantics of what transformations are not valid.
This commit is contained in:
parent
b82cd6c78d
commit
d6bbea2acf
@ -185,8 +185,14 @@ static void *laddr_pg(const struct dso *p, size_t v)
|
||||
}
|
||||
return (void *)(v - p->loadmap->segs[j].p_vaddr + p->loadmap->segs[j].addr);
|
||||
}
|
||||
#define fpaddr(p, v) ((void (*)())&(struct funcdesc){ \
|
||||
laddr(p, v), (p)->got })
|
||||
static void (*fdbarrier(void *p))()
|
||||
{
|
||||
void (*fd)();
|
||||
__asm__("" : "=r"(fd) : "0"(p));
|
||||
return fd;
|
||||
}
|
||||
#define fpaddr(p, v) fdbarrier((&(struct funcdesc){ \
|
||||
laddr(p, v), (p)->got }))
|
||||
#else
|
||||
#define laddr(p, v) (void *)((p)->base + (v))
|
||||
#define laddr_pg(p, v) laddr(p, v)
|
||||
|
Loading…
Reference in New Issue
Block a user