From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/14136 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: Rich Felker Newsgroups: gmane.linux.lib.musl.general Subject: Re: [PATCH] fix tls offsets when p_vaddr%p_align != 0 for TLS_ABOVE_TP Date: Thu, 16 May 2019 21:50:43 -0400 Message-ID: <20190517015043.GA23599@brightrain.aerifal.cx> References: <20190514020131.GC16415@port70.net> <20190516002051.GX23599@brightrain.aerifal.cx> <20190516074850.GD16415@port70.net> <20190516132246.GY23599@brightrain.aerifal.cx> <20190516225117.GF16415@port70.net> Reply-To: musl@lists.openwall.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="105987"; mail-complaints-to="usenet@blaine.gmane.org" User-Agent: Mutt/1.5.21 (2010-09-15) To: musl@lists.openwall.com Original-X-From: musl-return-14152-gllmg-musl=m.gmane.org@lists.openwall.com Fri May 17 03:51:01 2019 Return-path: Envelope-to: gllmg-musl@m.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by blaine.gmane.org with smtp (Exim 4.89) (envelope-from ) id 1hRS1T-000RQh-AY for gllmg-musl@m.gmane.org; Fri, 17 May 2019 03:50:59 +0200 Original-Received: (qmail 7337 invoked by uid 550); 17 May 2019 01:50:57 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Original-Received: (qmail 7317 invoked from network); 17 May 2019 01:50:56 -0000 Content-Disposition: inline In-Reply-To: <20190516225117.GF16415@port70.net> Original-Sender: Rich Felker Xref: news.gmane.org gmane.linux.lib.musl.general:14136 Archived-At: On Fri, May 17, 2019 at 12:51:18AM +0200, Szabolcs Nagy wrote: > * Rich Felker [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 > 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