From owner-freebsd-ppc@freebsd.org Tue Oct 30 11:00:01 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 E8D6810DF7EB for ; Tue, 30 Oct 2018 11:00:00 +0000 (UTC) (envelope-from tuexen@freebsd.org) Received: from drew.franken.de (mail-n.franken.de [193.175.24.27]) (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 827507D674 for ; Tue, 30 Oct 2018 11:00:00 +0000 (UTC) (envelope-from tuexen@freebsd.org) Received: from [10.0.1.118] (unknown [212.201.121.94]) (Authenticated sender: macmic) by mail-n.franken.de (Postfix) with ESMTPSA id BCB99721E280C for ; Tue, 30 Oct 2018 11:59:57 +0100 (CET) From: Michael Tuexen Mime-Version: 1.0 (Mac OS X Mail 12.0 \(3445.100.39\)) Subject: Fwd: svn commit: r339876 - head/libexec/rtld-elf Message-Id: References: To: FreeBSD PowerPC ML Date: Tue, 30 Oct 2018 11:59:57 +0100 X-Mailer: Apple Mail (2.3445.100.39) X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00, HTML_MESSAGE autolearn=disabled version=3.4.1 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on mail-n.franken.de Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable X-Content-Filtered-By: Mailman/MimeDel 2.1.29 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: Tue, 30 Oct 2018 11:00:01 -0000 FYI > 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. = Buildword > ends up with a world where almost all binaries are segfaulting.... = Especially gdb > (but svn, ls or so all segfault). >=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