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.pa...@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.eggle...@linux.intel.com> -- Paul Eggleton Intel Open Source Technology Centre _______________________________________________ Openembedded-core mailing list Openembedded-core@lists.openembedded.org http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core