From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MbX1j-0004Q1-Vx for qemu-devel@nongnu.org; Thu, 13 Aug 2009 05:55:20 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MbX1i-0004PM-6U for qemu-devel@nongnu.org; Thu, 13 Aug 2009 05:55:19 -0400 Received: from [199.232.76.173] (port=54429 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MbX1i-0004PI-0c for qemu-devel@nongnu.org; Thu, 13 Aug 2009 05:55:18 -0400 Received: from [84.20.150.76] (port=59989 helo=naru.obs2.net) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1MbX1h-0001Oi-9y for qemu-devel@nongnu.org; Thu, 13 Aug 2009 05:55:17 -0400 Date: Thu, 13 Aug 2009 12:55:12 +0300 From: Riku Voipio Subject: Re: [Qemu-devel] [PATCH] linux-user: elfload: allocate and initialize memsz-filesz gap Message-ID: <20090813095512.GA6866@kos.to> References: <200907121502.39025.jcmvbkbc@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200907121502.39025.jcmvbkbc@gmail.com> List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Max Filippov Cc: qemu-devel@nongnu.org On Sun, Jul 12, 2009 at 03:02:38PM +0400, Max Filippov wrote: > I'm having ppc ELF binaries that I'm running on x86 in linux-user emulation. > Some of these binaries work fine, but others segfault. > The latter binaries have segments with p_filesz < p_memsz and sections like .bss in this gap. > Segfaults usually happen in attempt to access address within this gap. > According to the linux-user/elfload.c only first p_filesz bytes of such segments are mmaped and mprotected. > This patch mmaps p_memsz bytes and then zero out last p_memsz - p_filesz bytes of such segments. > Is there a better way to do it? After applying this patch, any arm-linux binaries on x86 fail run. > Signed-off-by: Max Filippov > --- > diff -burN qemu-snapshot-2009-07-11_r7249-orig/linux-user/elfload.c qemu-snapshot-2009-07-11_r7249/linux-user/elfload.c > --- qemu-snapshot-2009-07-11_r7249-orig/linux-user/elfload.c 2009-07-11 06:12:23.000000000 +0400 > +++ qemu-snapshot-2009-07-11_r7249/linux-user/elfload.c 2009-07-12 04:47:47.000000000 +0400 > @@ -1380,7 +1380,7 @@ > } > > error = target_mmap(TARGET_ELF_PAGESTART(load_bias + elf_ppnt->p_vaddr), > - (elf_ppnt->p_filesz + > + (elf_ppnt->p_memsz + > TARGET_ELF_PAGEOFFSET(elf_ppnt->p_vaddr)), > elf_prot, > (MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE), > @@ -1392,6 +1392,20 @@ > exit(-1); > } > > + if(elf_ppnt->p_memsz > elf_ppnt->p_filesz) { > + abi_ulong pg = TARGET_ELF_PAGESTART(load_bias + elf_ppnt->p_vaddr) + > + (elf_ppnt->p_filesz + > + TARGET_ELF_PAGEOFFSET(elf_ppnt->p_vaddr)); > + abi_ulong sz = elf_ppnt->p_memsz - elf_ppnt->p_filesz; > + > + void *p = lock_user(PAGE_READ | PAGE_WRITE, pg, sz, 0); > + > + if (p) { > + memset(p, 0, sz); > + unlock_user(p, pg, sz); > + } > + } > + > #ifdef LOW_ELF_STACK > if (TARGET_ELF_PAGESTART(elf_ppnt->p_vaddr) < elf_stack) > elf_stack = TARGET_ELF_PAGESTART(elf_ppnt->p_vaddr); > > > Thanks. > -- Max >