From owner-svn-src-head@freebsd.org Fri Nov 2 15:30:28 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 DE75410FB08C for ; Fri, 2 Nov 2018 15:30:27 +0000 (UTC) (envelope-from marklmi26-fbsd@yahoo.com) Received: from sonic309-13.consmr.mail.bf2.yahoo.com (sonic309-13.consmr.mail.bf2.yahoo.com [74.6.129.123]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 861D870F87 for ; Fri, 2 Nov 2018 15:30:27 +0000 (UTC) (envelope-from marklmi26-fbsd@yahoo.com) X-YMail-OSG: troOBP4VM1mbUta_g9Ygl_aGMRGJ6r2xC8txOk.7kX2T_H7PJvXR9As9E_jcOFC D_wwPI.MI2wUnh1RPgLEfhwwuFEbEVhmNbz5xyvL38SgcohvaGzCEcdNKlfsfEN2SHUMLZLZYFdG ZW0nxaVDzGiywzc1cYpGwmBNgHfXmFWL3xM8nlmoIbKX2z9HFXXY4srLmedWmI4pp4.xYizm0cWw u8IugVZqz6zWdH2zlTubtE58Vdp4SPuBWdDPtSpQCpero2MbBlND92TfJZBEgEjj_shJFOEHCk76 jMKr5PrTZbcns4T4zOBwhSq7rc_sac7OGXbp2WmRr4ZXGZzSH95UiVmSscUfRtLWA1OsVTDNHq.M nt9OfW_0rZSZ88gsKiXDwupYEcgeFf.Ns6H9iOTecyZ14s_dTZXFg0ocWxv1Z3YgM.6rqjUDp3.Z dQ9jrs2cs902.TtiwQrGfND5XnFHBd6o5rZgL.kLrSblXzM36JrpIHCbUIFDG_4yo9MkssDdSNj8 jy_Hq.QC_xcU06r8_u_QtzyBzDxMDG7XQXtA4k6fm4HoDiTsWyJMMba3SHInbVFpHkd8QaSwlfo0 pLDQU8GTOetRkxqzCXsKYgF2FitJOi3l.WTwfDVkm5w9YZLGtPqvpPsf17pQsMCJ9qqpx5divHsX UC0oCwlz15eK6oD208w1Dk3iHo2b.RlJgKq0Vd.HLlA4mKU41WonSRcL8bCjRGB5_JNyyqeF0NlX nczxV8mA9EcxaI_IBHQbro2W15LKGuivykcQnM6DOmHzJ.rkb223zfbk3j9lGldMxLFoNnhAKF.a y8mQVFaL0zg7Z4ug6W03CI4GXI1zCCAqjO.0pSZr6ff1qij_2mTBq9PPMggWwPLPZXId231F0kge shfsts0FmgrvZPfAPQzyWLZFSQIfCWhQMG.WKYjyRzXAPB9jb9TFmWtf5t8cLQDTsq84FOKqSApQ II7dehbQ9pJ48I72.qoqpfcqvNkgPxnJEy1bTrwuY8dkEqfMMBliWf9z3r0DBoRIsFSTPEVte7hR GfvXIBtSv6R2vReJkhU66dysmj_SmG5GEfnp7B.KTkgSQ_FG8h1d3 Received: from sonic.gate.mail.ne1.yahoo.com by sonic309.consmr.mail.bf2.yahoo.com with HTTP; Fri, 2 Nov 2018 15:30:20 +0000 Received: from c-76-115-7-162.hsd1.or.comcast.net (EHLO [192.168.1.25]) ([76.115.7.162]) by smtp403.mail.bf1.yahoo.com (Oath Hermes SMTP Server) with ESMTPA ID 89b5998a80528e3d8a876e5dfa458a70; Fri, 02 Nov 2018 15:30:19 +0000 (UTC) Content-Type: text/plain; charset=us-ascii Mime-Version: 1.0 (Mac OS X Mail 11.5 \(3445.9.1\)) Subject: Re: svn commit: r339876 - head/libexec/rtld-elf From: Mark Millard In-Reply-To: <20181102113827.GM5335@kib.kiev.ua> Date: Fri, 2 Nov 2018 08:30:17 -0700 Cc: svn-src-head@freebsd.org, Alexander Richardson Content-Transfer-Encoding: quoted-printable Message-Id: <7B29A4C8-228D-41CB-B594-98DFA456E9C8@yahoo.com> References: <8E5A5F3A-F1A7-4702-A2F7-65D74CC5B2E5@yahoo.com> <20181102004101.GI5335@kib.kiev.ua> <003A49D7-6E8B-4775-A70B-E0EB44505D4B@yahoo.com> <20181102113827.GM5335@kib.kiev.ua> To: Konstantin Belousov X-Mailer: Apple Mail (2.3445.9.1) 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: Fri, 02 Nov 2018 15:30:28 -0000 On 2018-Nov-2, at 4:38 AM, Konstantin Belousov = wrote: > On Fri, Nov 02, 2018 at 12:16:23AM -0700, Mark Millard wrote: >> It stops when the dcbst in __syncicache runs into an address in >> the p_align 65536 caused hole between the two PT_LOAD's with PF_X. >> /bin/ls itself has such a hole, as do the .so libraries involved. >=20 > Try this. I only compile-tested the change. >=20 > diff --git a/libexec/rtld-elf/powerpc/reloc.c = b/libexec/rtld-elf/powerpc/reloc.c > index e921a4dc7d1..5f21e33bee3 100644 > --- a/libexec/rtld-elf/powerpc/reloc.c > +++ b/libexec/rtld-elf/powerpc/reloc.c > @@ -294,6 +294,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, = int flags, > { > const Elf_Rela *relalim; > const Elf_Rela *rela; > + const Elf_Phdr *phdr; > SymCache *cache; > int r =3D -1; >=20 > @@ -327,8 +328,18 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry = *obj_rtld, int flags, > if (cache !=3D NULL) > free(cache); >=20 > - /* Synchronize icache for text seg in case we made any changes = */ > - __syncicache(obj->mapbase, obj->textsize); > + /* > + * Synchronize icache for executable segments in case we made > + * any changes. > + */ > + for (phdr =3D obj->phdr; > + (const char *)phdr < (const char *)obj->phdr + obj->phsize; > + phdr++) { > + if (phdr->p_type =3D=3D PT_LOAD && (phdr->p_flags & = PF_X) !=3D 0) { > + __syncicache(obj->mapbase + phdr->p_vaddr, > + phdr->p_memsz); > + } > + } >=20 > return (r); > } > diff --git a/libexec/rtld-elf/powerpc64/reloc.c = b/libexec/rtld-elf/powerpc64/reloc.c > index c2d6dac13b1..980b4933afe 100644 > --- a/libexec/rtld-elf/powerpc64/reloc.c > +++ b/libexec/rtld-elf/powerpc64/reloc.c > @@ -291,6 +291,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, = int flags, > { > const Elf_Rela *relalim; > const Elf_Rela *rela; > + const Elf_Phdr *phdr; > SymCache *cache; > int bytes =3D obj->dynsymcount * sizeof(SymCache); > int r =3D -1; > @@ -327,8 +328,18 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry = *obj_rtld, int flags, > if (cache) > munmap(cache, bytes); >=20 > - /* Synchronize icache for text seg in case we made any changes = */ > - __syncicache(obj->mapbase, obj->textsize); > + /* > + * Synchronize icache for executable segments in case we made > + * any changes. > + */ > + for (phdr =3D obj->phdr; > + (const char *)phdr < (const char *)obj->phdr + obj->phsize; > + phdr++) { > + if (phdr->p_type =3D=3D PT_LOAD && (phdr->p_flags & = PF_X) !=3D 0) { > + __syncicache(obj->mapbase + phdr->p_vaddr, > + phdr->p_memsz); > + } > + } >=20 > return (r); > } >=20 Unfortunately, that failed: (gdb) run The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: = /usr/obj/powerpcvtsc_gcc421/powerpc.powerpc/usr/src/powerpc.powerpc/libexe= c/rtld-elf/ld-elf.so.1.full /bin/ls Breakpoint 4, reloc_non_plt (obj=3D0x41041000, obj_rtld=3D0x1801cc7, = flags=3D4, lockstate=3D0x0) at = /usr/src/libexec/rtld-elf/powerpc/reloc.c:338 338 __syncicache(obj->mapbase + = phdr->p_vaddr, 1: x/i $pc =3D> 0x1012b90 : lwz r0,36(r29) (gdb) print/x obj->mapbase+phdr->p_vaddr $17 =3D 0x3000000 (gdb) print/x obj->mapbase =20 $18 =3D 0x1800000 (gdb) print/x phdr->p_vaddr $19 =3D 0x1800000 (gdb) c Continuing. Program received signal SIGSEGV, Segmentation fault. __syncicache (from=3D0x3000000, len=3D34112) at = /usr/src/lib/libc/powerpc/gen/syncicache.c:94 94 __asm __volatile ("dcbst 0,%0" :: "r"(p)); 1: x/i $pc =3D> 0x10228b8 <__syncicache+96>: dcbst 0,r11 It looks to me like the 0x1800000 component of the overall figure was double counted. ( phdr->p_vaddr would vary but obj->mapbase would not. ) Omit "obj->mapbase + "? =3D=3D=3D Mark Millard marklmi at yahoo.com ( dsl-only.net went away in early 2018-Mar)