From owner-svn-src-head@freebsd.org Tue Oct 30 10:17:44 2018 Return-Path: Delivered-To: svn-src-head@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 9B64710DE68D; Tue, 30 Oct 2018 10:17:44 +0000 (UTC) (envelope-from Michael.Tuexen@macmic.franken.de) 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 A7D3A7BF5B; Tue, 30 Oct 2018 10:17:43 +0000 (UTC) (envelope-from Michael.Tuexen@macmic.franken.de) Received: from [10.0.1.118] (unknown [212.201.121.94]) (Authenticated sender: macmic) by mail-n.franken.de (Postfix) with ESMTPSA id 88BE3721E280C; Tue, 30 Oct 2018 11:17:40 +0100 (CET) Content-Type: text/plain; charset=us-ascii Mime-Version: 1.0 (Mac OS X Mail 12.0 \(3445.100.39\)) Subject: Re: svn commit: r339876 - head/libexec/rtld-elf From: Michael Tuexen In-Reply-To: <201810292108.w9TL83bO041913@repo.freebsd.org> Date: Tue, 30 Oct 2018 11:17:39 +0100 Cc: src-committers , svn-src-all@freebsd.org, svn-src-head@freebsd.org Content-Transfer-Encoding: quoted-printable Message-Id: References: <201810292108.w9TL83bO041913@repo.freebsd.org> To: Alex Richardson X-Mailer: Apple Mail (2.3445.100.39) 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: svn-src-head@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 30 Oct 2018 10:17:44 -0000 > 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). 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