* [PATCH] postinst-intercepts: fix issue on 32 bit hosts
@ 2013-04-05 14:28 Laurentiu Palcu
2013-04-05 16:12 ` [PATCH v2] postinst-intercepts, qemu.bbclass: " Laurentiu Palcu
0 siblings, 1 reply; 3+ messages in thread
From: Laurentiu Palcu @ 2013-04-05 14:28 UTC (permalink / raw)
To: openembedded-core
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>
---
scripts/postinst-intercepts/update_font_cache | 4 +---
scripts/postinst-intercepts/update_pixbuf_cache | 3 +--
2 files changed, 2 insertions(+), 5 deletions(-)
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
--
1.7.9.5
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH v2] postinst-intercepts, qemu.bbclass: fix issue on 32 bit hosts
2013-04-05 14:28 [PATCH] postinst-intercepts: fix issue on 32 bit hosts Laurentiu Palcu
@ 2013-04-05 16:12 ` Laurentiu Palcu
2013-04-05 18:30 ` Paul Eggleton
0 siblings, 1 reply; 3+ messages in thread
From: Laurentiu Palcu @ 2013-04-05 16:12 UTC (permalink / raw)
To: openembedded-core
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
--
1.7.9.5
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v2] postinst-intercepts, qemu.bbclass: fix issue on 32 bit hosts
2013-04-05 16:12 ` [PATCH v2] postinst-intercepts, qemu.bbclass: " Laurentiu Palcu
@ 2013-04-05 18:30 ` Paul Eggleton
0 siblings, 0 replies; 3+ messages in thread
From: Paul Eggleton @ 2013-04-05 18:30 UTC (permalink / raw)
To: Laurentiu Palcu; +Cc: openembedded-core
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
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2013-04-05 18:47 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox