From owner-freebsd-ppc@freebsd.org Wed Oct 31 15:08:11 2018 Return-Path: Delivered-To: freebsd-ppc@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id A8E6510DC907 for ; Wed, 31 Oct 2018 15:08:11 +0000 (UTC) (envelope-from tuexen@freebsd.org) Received: from drew.franken.de (drew.ipv6.franken.de [IPv6:2001:638:a02:a001:20e:cff:fe4a:feaa]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "*.franken.de", Issuer "COMODO RSA Domain Validation Secure Server CA" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 3D10C79EE7; Wed, 31 Oct 2018 15:08:11 +0000 (UTC) (envelope-from tuexen@freebsd.org) Received: from [IPv6:2003:cd:6f29:a600:484e:bd61:3585:3513] (p200300CD6F29A600484EBD6135853513.dip0.t-ipconnect.de [IPv6:2003:cd:6f29:a600:484e:bd61:3585:3513]) (Authenticated sender: macmic) by mail-n.franken.de (Postfix) with ESMTPSA id B4842721E280C; Wed, 31 Oct 2018 16:08:07 +0100 (CET) Content-Type: text/plain; charset=us-ascii Mime-Version: 1.0 (Mac OS X Mail 12.1 \(3445.101.1\)) Subject: Re: svn commit: r339876 - head/libexec/rtld-elf From: Michael Tuexen In-Reply-To: <77371AC1-C422-47A6-9EA5-9A92F958D86B@yahoo.com> Date: Wed, 31 Oct 2018 16:08:06 +0100 Cc: FreeBSD PowerPC ML , Alexander Richardson Content-Transfer-Encoding: quoted-printable Message-Id: <24896738-5D46-46FB-A41A-E6719F169109@freebsd.org> References: <77371AC1-C422-47A6-9EA5-9A92F958D86B@yahoo.com> To: Mark Millard X-Mailer: Apple Mail (2.3445.101.1) X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=disabled version=3.4.1 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on mail-n.franken.de X-BeenThere: freebsd-ppc@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Porting FreeBSD to the PowerPC List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 31 Oct 2018 15:08:11 -0000 > On 31. Oct 2018, at 15:33, Mark Millard wrote: >=20 > On 2018-Oct-30, at 3:59 AM, Michael Tuexen = wrote: >=20 >> FYI >>=20 >>> Begin forwarded message: >>>=20 >>> From: Michael Tuexen >>> Subject: Re: svn commit: r339876 - head/libexec/rtld-elf >>> Date: 30. October 2018 at 11:17:39 CET >>> To: Alex Richardson >>> Cc: src-committers , = svn-src-all@freebsd.org, svn-src-head@freebsd.org >>>=20 >>>> On 29. Oct 2018, at 22:08, Alex Richardson = wrote: >>>>=20 >>>> Author: arichardson >>>> Date: Mon Oct 29 21:08:02 2018 >>>> New Revision: 339876 >>>> URL: https://svnweb.freebsd.org/changeset/base/339876 >>>>=20 >>>> Log: >>>> rtld: set obj->textsize correctly >>>>=20 >>>> With lld-generated binaries the first PT_LOAD will usually be a = read-only >>>> segment unless you pass --no-rosegment. For those binaries the = textsize is >>>> determined by the next PT_LOAD. To allow both LLD and bfd 2.17 = binaries to >>>> be parsed correctly use the end of the last PT_LOAD that is marked = as >>>> executable instead. >>>>=20 >>>> I noticed that the value was wrong while adding some debug prints = for some rtld >>>> changes for CHERI binaries. `obj->textsize` only seems to be used = by PPC so the >>>> effect is untested. However, the value before was definitely wrong = and the new >>>> result matches the phdrs. >>> I build kernel and world with a revision later than this on a PPC. >=20 > Which have you tried: 32 bit? 64 bit? Both? If both, do both fail? Both. Only the 32-bit version shows the problem. Reverting this commit and rebuilding /libexec/ld-elf.so.1 resolves the problem. So I can confirm that this commit results in problems for 32-bit powerppc. >=20 > What version did the buildworld buildkernel ? What version was > built by the buildworld buildkernel (that was later installed > and had failures)? I was building r339914. >=20 > Do you know what version did the prior buildworld buildkernel (that > produced the version that did this buildworld buildkernel)? If yes, > what was it? No. Just reverting this commit resolves the issue. >=20 >>> Buildword >>> ends up with a world where almost all binaries are segfaulting.... = Especially gdb >>> (but svn, ls or so all segfault). >=20 > Which fail: >=20 > /usr/local/bin/gdb ? /usr/libexec/gdb ? Both? > /usr/local/bin/svn ? /usr/bin/svnlite ? Both? > /bin/ls ? /rescue/ls ? Both? >=20 > That last may be the more important comparison. Not the ones from /rescue. I used these tools to recover the system. Failing binaries where /usr/local/bin/gdb, /usr/local/bin/svn. You can reproduce the issue. Just update the sources and to make and = make install in head/libexec/rtld-elf Best regards Michael >=20 >>>=20 >>> Best regards >>> Michael >>>>=20 >>>> Reviewed By: kib >>>> Approved By: brooks (mentor) >>>> Differential Revision: https://reviews.freebsd.org/D17117 >>>>=20 >>>> Modified: >>>> head/libexec/rtld-elf/map_object.c >>>> head/libexec/rtld-elf/rtld.c >>>>=20 >>>> Modified: head/libexec/rtld-elf/map_object.c >>>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>>> --- head/libexec/rtld-elf/map_object.c Mon Oct 29 21:03:43 2018 = (r339875) >>>> +++ head/libexec/rtld-elf/map_object.c Mon Oct 29 21:08:02 2018 = (r339876) >>>> @@ -93,6 +93,7 @@ map_object(int fd, const char *path, const struct = stat >>>> Elf_Addr note_end; >>>> char *note_map; >>>> size_t note_map_len; >>>> + Elf_Addr text_end; >>>>=20 >>>> hdr =3D get_elf_header(fd, path, sb); >>>> if (hdr =3D=3D NULL) >>>> @@ -116,6 +117,7 @@ map_object(int fd, const char *path, const = struct stat >>>> note_map =3D NULL; >>>> segs =3D alloca(sizeof(segs[0]) * hdr->e_phnum); >>>> stack_flags =3D RTLD_DEFAULT_STACK_PF_EXEC | PF_R | PF_W; >>>> + text_end =3D 0; >>>> while (phdr < phlimit) { >>>> switch (phdr->p_type) { >>>>=20 >>>> @@ -130,6 +132,10 @@ map_object(int fd, const char *path, const = struct stat >>>> path, nsegs); >>>> goto error; >>>> } >>>> + if ((segs[nsegs]->p_flags & PF_X) =3D=3D PF_X) { >>>> + text_end =3D MAX(text_end, >>>> + round_page(segs[nsegs]->p_vaddr + = segs[nsegs]->p_memsz)); >>>> + } >>>> break; >>>>=20 >>>> case PT_PHDR: >>>> @@ -280,8 +286,7 @@ map_object(int fd, const char *path, const = struct stat >>>> } >>>> obj->mapbase =3D mapbase; >>>> obj->mapsize =3D mapsize; >>>> - obj->textsize =3D round_page(segs[0]->p_vaddr + = segs[0]->p_memsz) - >>>> - base_vaddr; >>>> + obj->textsize =3D text_end - base_vaddr; >>>> obj->vaddrbase =3D base_vaddr; >>>> obj->relocbase =3D mapbase - base_vaddr; >>>> obj->dynamic =3D (const Elf_Dyn *) (obj->relocbase + = phdyn->p_vaddr); >>>>=20 >>>> Modified: head/libexec/rtld-elf/rtld.c >>>> = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D >>>> --- head/libexec/rtld-elf/rtld.c Mon Oct 29 21:03:43 2018 = (r339875) >>>> +++ head/libexec/rtld-elf/rtld.c Mon Oct 29 21:08:02 2018 = (r339876) >>>> @@ -1390,13 +1390,15 @@ digest_phdr(const Elf_Phdr *phdr, int = phnum, caddr_t e >>>> if (nsegs =3D=3D 0) { /* First load segment */ >>>> obj->vaddrbase =3D trunc_page(ph->p_vaddr); >>>> obj->mapbase =3D obj->vaddrbase + obj->relocbase; >>>> - obj->textsize =3D round_page(ph->p_vaddr + ph->p_memsz) = - >>>> - obj->vaddrbase; >>>> } else { /* Last load segment */ >>>> obj->mapsize =3D round_page(ph->p_vaddr + ph->p_memsz) - >>>> obj->vaddrbase; >>>> } >>>> nsegs++; >>>> + if ((ph->p_flags & PF_X) =3D=3D PF_X) { >>>> + obj->textsize =3D MAX(obj->textsize, >>>> + round_page(ph->p_vaddr + ph->p_memsz) - = obj->vaddrbase); >>>> + } >>>> break; >>>>=20 >>>> case PT_DYNAMIC: >>>>=20 >>>=20 >>>=20 >>=20 >=20 >=20 > =3D=3D=3D > Mark Millard > marklmi at yahoo.com > ( dsl-only.net went > away in early 2018-Mar) >=20