Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 31 Oct 2018 07:33:43 -0700
From:      Mark Millard <marklmi@yahoo.com>
To:        Michael Tuexen <tuexen@freebsd.org>
Cc:        FreeBSD PowerPC ML <freebsd-ppc@freebsd.org>
Subject:   Re: svn commit: r339876 - head/libexec/rtld-elf
Message-ID:  <77371AC1-C422-47A6-9EA5-9A92F958D86B@yahoo.com>
In-Reply-To: <DD8CF13B-DD0A-4DBA-BA5E-242BD791A878@freebsd.org>
References:  <B4656C50-1A08-4E0E-B0F4-2DA527840679@macmic.franken.de> <DD8CF13B-DD0A-4DBA-BA5E-242BD791A878@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 2018-Oct-30, at 3:59 AM, Michael Tuexen <tuexen at freebsd.org> =
wrote:

> 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.

Which have you tried: 32 bit? 64 bit? Both? If both, do both fail?

What version did the buildworld buildkernel ? What version was
built by the buildworld buildkernel (that was later installed
and had failures)?

Do you know what version did the prior buildworld buildkernel (that
produced the version that did this buildworld buildkernel)? If yes,
what was it?

>> Buildword
>> ends up with a world where almost all binaries are segfaulting.... =
Especially gdb
>> (but svn, ls or so all segfault).

Which fail:

/usr/local/bin/gdb ? /usr/libexec/gdb ? Both?
/usr/local/bin/svn ? /usr/bin/svnlite ? Both?
/bin/ls ?            /rescue/ls ?       Both?

That last may be the more important comparison.

>>=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


=3D=3D=3D
Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?77371AC1-C422-47A6-9EA5-9A92F958D86B>