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>