[OE-core] [PATCH v2] postinst-intercepts, qemu.bbclass: fix issue on 32 bit hosts

Paul Eggleton paul.eggleton at linux.intel.com
Fri Apr 5 18:30:24 UTC 2013


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 at 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 at linux.intel.com>

-- 

Paul Eggleton
Intel Open Source Technology Centre




More information about the Openembedded-core mailing list