From: Paul Eggleton <paul.eggleton@linux.intel.com>
To: Laurentiu Palcu <laurentiu.palcu@intel.com>
Cc: openembedded-core@lists.openembedded.org
Subject: Re: [PATCH v2] postinst-intercepts, qemu.bbclass: fix issue on 32 bit hosts
Date: Fri, 05 Apr 2013 19:30:24 +0100 [thread overview]
Message-ID: <1772053.lXJvoCbPnm@helios> (raw)
In-Reply-To: <1365178346-13759-1-git-send-email-laurentiu.palcu@intel.com>
On Friday 05 April 2013 19:12:26 Laurentiu Palcu wrote:
> The intercept scripts fail to run on 32 bit hosts. Apparently, the
> current approach worked on 64 bit hosts due to the larger virtual address
> space (probably). On 32 bit hosts, however, calling the target binary like:
>
> qemu-arm ld-linux.so --library-path /lib:/usr/lib arm_binary
>
> fails with:
>
> arm_binary: error while loading shared libraries: arm_binary: failed to
> map segment from shared object: Operation not permitted
>
> When run like this, qemu-arm fails to map the arm_binary executable in
> memory because it's hitting the lower limit of
> /proc/sys/vm/mmap_min_addr. That's because it loads the
> ld-linux.so binary successfully, taking into account mmap_min_addr, runs
> it, and then ld-linux.so will map the arm_binary at a fixed address but this
> will fail because it is below mmap_min_addr. The qemu's guest base probing,
> apparently, doesn't work fine when a program runs inside other.
>
> One way around this would be to set mmap_min_addr to 0 (on recent
> distributions is set to 65536 to avoid "kernel NULL pointer dereference"
> defects) but this approach is not safe.
>
> The other way is to call the binary directly but providing qemu with a
> prefix (-L option) in order to find the elf interpreter correctly. This
> way, both the target binary and dynamic loader are mapped into memory
> under qemu's control and, only after, the dynamic loader is started.
>
> [YOCTO #4179]
>
> Signed-off-by: Laurentiu Palcu <laurentiu.palcu@intel.com>
> ---
> Changes in v2:
> * changed the qemu_run_binary() helper function too
>
> Thanks,
> Laurentiu
>
> meta/classes/qemu.bbclass | 8 +-------
> scripts/postinst-intercepts/update_font_cache | 4 +---
> scripts/postinst-intercepts/update_pixbuf_cache | 3 +--
> 3 files changed, 3 insertions(+), 12 deletions(-)
>
> diff --git a/meta/classes/qemu.bbclass b/meta/classes/qemu.bbclass
> index 8b03926..0e71d6a 100644
> --- a/meta/classes/qemu.bbclass
> +++ b/meta/classes/qemu.bbclass
> @@ -29,10 +29,4 @@ def qemu_run_binary(data, rootfs_path, binary):
> if qemu_binary == "qemu-allarch":
> qemu_binary = "qemuwrapper"
>
> - dynamic_loader = rootfs_path + '$(readelf -l ' + rootfs_path + \
> - binary + '| grep "Requesting program interpreter"|sed
> -e \'s/^.*\[.*: \(.*\)\]/\\1/\')' - library_path = rootfs_path +
> data.getVar("base_libdir", True) + ":" + \ - rootfs_path
> + data.getVar("libdir", True)
> -
> - return "PSEUDO_UNLOAD=1 " + qemu_binary + " " + dynamic_loader + "
> --library-path " + library_path \ - + " " + rootfs_path + binary
> + return "PSEUDO_UNLOAD=1 " + qemu_binary + " -L " + rootfs_path + " " +
> rootfs_path + binary diff --git
> a/scripts/postinst-intercepts/update_font_cache
> b/scripts/postinst-intercepts/update_font_cache index 562b5b3..ad1bab3
> 100644
> --- a/scripts/postinst-intercepts/update_font_cache
> +++ b/scripts/postinst-intercepts/update_font_cache
> @@ -1,7 +1,5 @@
> #!/bin/sh
>
> -PSEUDO_UNLOAD=1 qemuwrapper $D$(readelf -l $D${bindir}/fc-cache| grep
> "Requesting program interpreter"|sed -e 's/^.*\[.*: \(.*\)\]/\1/') \ -
> --library-path $D/lib:$D/usr/lib $D${bindir}/fc-cache \
> - --sysroot=$D >/dev/null 2>&1
> +PSEUDO_UNLOAD=1 qemuwrapper -L $D $D${bindir}/fc-cache --sysroot=$D
> >/dev/null 2>&1
>
>
> diff --git a/scripts/postinst-intercepts/update_pixbuf_cache
> b/scripts/postinst-intercepts/update_pixbuf_cache index 64033dc..9134529
> 100644
> --- a/scripts/postinst-intercepts/update_pixbuf_cache
> +++ b/scripts/postinst-intercepts/update_pixbuf_cache
> @@ -2,8 +2,7 @@
>
> export GDK_PIXBUF_MODULEDIR=$D${libdir}/gdk-pixbuf-2.0/2.10.0/loaders
>
> -PSEUDO_UNLOAD=1 qemuwrapper $D$(readelf -l
> $D${bindir}/gdk-pixbuf-query-loaders|grep "Requesting program
> interpreter"|sed -e 's/^.*\[.*: \(.*\)\]/\1/') \ - --library-path
> $D/lib:$D/usr/lib $D${bindir}/gdk-pixbuf-query-loaders \ +PSEUDO_UNLOAD=1
> qemuwrapper -L $D $D${bindir}/gdk-pixbuf-query-loaders \
> >$GDK_PIXBUF_MODULEDIR/../loaders.cache 2>/dev/null && \
>
> sed -i -e "s:$D::g" $GDK_PIXBUF_MODULEDIR/../loaders.cache
This fixes the problem for me.
Acked-by: Paul Eggleton <paul.eggleton@linux.intel.com>
--
Paul Eggleton
Intel Open Source Technology Centre
prev parent reply other threads:[~2013-04-05 18:47 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-05 14:28 [PATCH] postinst-intercepts: fix issue on 32 bit hosts Laurentiu Palcu
2013-04-05 16:12 ` [PATCH v2] postinst-intercepts, qemu.bbclass: " Laurentiu Palcu
2013-04-05 18:30 ` Paul Eggleton [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1772053.lXJvoCbPnm@helios \
--to=paul.eggleton@linux.intel.com \
--cc=laurentiu.palcu@intel.com \
--cc=openembedded-core@lists.openembedded.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox