Running qemu-i386 on a system running with SELinux in enforcing mode fails with:
qemu-i386: tests/tcg/i386-linux-user/sigreturn-sigmask: Unable to find a guest_base to satisfy all guest address mapping requirements 00000000-ffffffff The reason is that main() determines mmap_min_addr from /proc/sys/vm/mmap_min_addr, but SELinux additionally defines CONFIG_LSM_MMAP_MIN_ADDR, which is normally larger: 32K or 64K, but, in general, can be anything. There is no portable way to query its value: /boot/config, /proc/config and /proc/config.gz are distro- and environment-specific. For maximum compatibility, probing is required. Use pgb_find_fallback() for this purpose. The downside of this approach is that mmap_min_addr remains incorrect, but there don't seem to be any practical consequences from this. If a correct mmap_min_addr will be required in the future, probing will need to be moved to linux-user main(). Signed-off-by: Ilya Leoshkevich <i...@linux.ibm.com> --- linux-user/elfload.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/linux-user/elfload.c b/linux-user/elfload.c index 6cef8db3b53..f6fb937d68a 100644 --- a/linux-user/elfload.c +++ b/linux-user/elfload.c @@ -2968,6 +2968,10 @@ static void pgb_dynamic(const char *image_name, uintptr_t guest_loaddr, ret = pgb_find_itree(&ga, root, align, brk); free_self_maps(root); + + if (ret == -1) { + ret = pgb_find_fallback(&ga, align, brk); + } } if (ret == -1) { -- 2.47.0