Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 30 Oct 2018 11:59:57 +0100
From:      Michael Tuexen <tuexen@freebsd.org>
To:        FreeBSD PowerPC ML <freebsd-ppc@freebsd.org>
Subject:   Fwd: svn commit: r339876 - head/libexec/rtld-elf
Message-ID:  <DD8CF13B-DD0A-4DBA-BA5E-242BD791A878@freebsd.org>
References:  <B4656C50-1A08-4E0E-B0F4-2DA527840679@macmic.franken.de>

next in thread | previous in thread | raw e-mail | index | archive | help
FYI

> Begin forwarded message:
>=20
> From: Michael Tuexen <Michael.Tuexen@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. =
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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?DD8CF13B-DD0A-4DBA-BA5E-242BD791A878>