|
Message-ID: <20190517015043.GA23599@brightrain.aerifal.cx> Date: Thu, 16 May 2019 21:50:43 -0400 From: Rich Felker <dalias@...c.org> To: musl@...ts.openwall.com Subject: Re: [PATCH] fix tls offsets when p_vaddr%p_align != 0 for TLS_ABOVE_TP On Fri, May 17, 2019 at 12:51:18AM +0200, Szabolcs Nagy wrote: > * Rich Felker <dalias@...c.org> [2019-05-16 09:22:46 -0400]: > > > i can make the tls_offset fix a separate change from > > > the p_vaddr%p_align!=0 fix. > > > > I'd like that, both because it was non-obvious to me that this was > > another major change, and because it fixes a separate, major > > user-facing bug (this is what was breaking rust, and could break lots > > of other things) rather than the new issue with lld's Bionic hack. > > ok Thanks! > From 28dd0b581b4d8b0903447b5e169155f11be94cf7 Mon Sep 17 00:00:00 2001 > From: Szabolcs Nagy <nsz@...t70.net> > Date: Mon, 13 May 2019 18:47:11 +0000 > Subject: [PATCH 2/2] fix tls offsets when p_vaddr%p_align != 0 on TLS_ABOVE_TP > targets > > currently the bfd linker does not seem to create tls segments where > p_vaddr%p_align != 0, but this is valid in ELF and then the runtime > computed tls offset must satisfy > > offset%p_align == (base+p_vaddr)%p_align > > and in case of local exec tls (main executable) the smallest such > offset must be used (otherwise it is incompatible with the offset > computed by the static linker). the !TLS_ABOVE_TP case is handled > correctly (the offset is negative then in the formula). > > the ldso code for TLS_ABOVE_TP is changed so the static tls offset > of each module satisfies the formula. > --- > ldso/dynlink.c | 7 ++++--- > src/env/__init_tls.c | 3 ++- > 2 files changed, 6 insertions(+), 4 deletions(-) > > diff --git a/ldso/dynlink.c b/ldso/dynlink.c > index 566b69e6..f9a7cc06 100644 > --- a/ldso/dynlink.c > +++ b/ldso/dynlink.c > @@ -1126,8 +1126,8 @@ static struct dso *load_library(const char *name, struct dso *needed_by) > p->tls_id = ++tls_cnt; > tls_align = MAXP2(tls_align, p->tls.align); > #ifdef TLS_ABOVE_TP > - p->tls.offset = tls_offset + ( (tls_align-1) & > - -(tls_offset + (uintptr_t)p->tls.image) ); > + p->tls.offset = tls_offset + ( (p->tls_align-1) & ~~~~~~~~~ This should be tls.align. I can fix it up though when applying. Rich
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.