summaryrefslogtreecommitdiffstats
path: root/meta/classes
diff options
context:
space:
mode:
authorLaurentiu Palcu <laurentiu.palcu@intel.com>2013-04-05 19:12:26 +0300
committerRichard Purdie <richard.purdie@linuxfoundation.org>2013-04-05 17:36:34 +0100
commit1872ee316b77926d2b9ede27f9d428a3b2a8b3fe (patch)
tree5753f00ef1bc5445e929fe079af83d2013756713 /meta/classes
parent419ef63ba5741ab67c91cbb96ee0c11e44975cb0 (diff)
downloadpoky-1872ee316b77926d2b9ede27f9d428a3b2a8b3fe.tar.gz
postinst-intercepts, qemu.bbclass: fix issue on 32 bit hosts
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] (From OE-Core rev: 78f91e08c8a7b0f0c831a087f7c89e2c76047e7a) Signed-off-by: Laurentiu Palcu <laurentiu.palcu@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/classes')
-rw-r--r--meta/classes/qemu.bbclass8
1 files changed, 1 insertions, 7 deletions
diff --git a/meta/classes/qemu.bbclass b/meta/classes/qemu.bbclass
index 8b039266b9..0e71d6aaad 100644
--- a/meta/classes/qemu.bbclass
+++ b/meta/classes/qemu.bbclass
@@ -29,10 +29,4 @@ def qemu_run_binary(data, rootfs_path, binary):
29 if qemu_binary == "qemu-allarch": 29 if qemu_binary == "qemu-allarch":
30 qemu_binary = "qemuwrapper" 30 qemu_binary = "qemuwrapper"
31 31
32 dynamic_loader = rootfs_path + '$(readelf -l ' + rootfs_path + \ 32 return "PSEUDO_UNLOAD=1 " + qemu_binary + " -L " + rootfs_path + " " + rootfs_path + binary
33 binary + '| grep "Requesting program interpreter"|sed -e \'s/^.*\[.*: \(.*\)\]/\\1/\')'
34 library_path = rootfs_path + data.getVar("base_libdir", True) + ":" + \
35 rootfs_path + data.getVar("libdir", True)
36
37 return "PSEUDO_UNLOAD=1 " + qemu_binary + " " + dynamic_loader + " --library-path " + library_path \
38 + " " + rootfs_path + binary