Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 31 Oct 2018 16:08:06 +0100
From:      Michael Tuexen <tuexen@freebsd.org>
To:        Mark Millard <marklmi@yahoo.com>
Cc:        FreeBSD PowerPC ML <freebsd-ppc@freebsd.org>, Alexander Richardson <arichardson@freebsd.org>
Subject:   Re: svn commit: r339876 - head/libexec/rtld-elf
Message-ID:  <24896738-5D46-46FB-A41A-E6719F169109@freebsd.org>
In-Reply-To: <77371AC1-C422-47A6-9EA5-9A92F958D86B@yahoo.com>
References:  <B4656C50-1A08-4E0E-B0F4-2DA527840679@macmic.franken.de> <DD8CF13B-DD0A-4DBA-BA5E-242BD791A878@freebsd.org> <77371AC1-C422-47A6-9EA5-9A92F958D86B@yahoo.com>

next in thread | previous in thread | raw e-mail | index | archive | help
> On 31. Oct 2018, at 15:33, Mark Millard <marklmi@yahoo.com> wrote:
>=20
> On 2018-Oct-30, at 3:59 AM, Michael Tuexen <tuexen at freebsd.org> =
wrote:
>=20
>> FYI
>>=20
>>> Begin forwarded message:
>>>=20
>>> From: Michael Tuexen <Michael.Tuexen at macmic.franken.de>
>>> Subject: Re: svn commit: r339876 - head/libexec/rtld-elf
>>> Date: 30. October 2018 at 11:17:39 CET
>>> To: Alex Richardson <arichardson@FreeBSD.org>
>>> Cc: src-committers <src-committers@freebsd.org>, =
svn-src-all@freebsd.org, svn-src-head@freebsd.org
>>>=20
>>>> On 29. Oct 2018, at 22:08, Alex Richardson =
<arichardson@FreeBSD.org> 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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?24896738-5D46-46FB-A41A-E6719F169109>