[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Bug#931641: perl: FTBFS under qemu-user



Hi!

On 7/10/19 7:45 PM, John Paul Adrian Glaubitz wrote:
> Laurent helped me debugging and the problem is that Debian has its own binfmt-support
> packages which competes with systemd-binfmt with the former not setting the preserve
> flag.

It works for me with the attached patch by Laurent Vivier.

Activate with:

# apt purge binfmt-support
# rm /usr/bin/qemu-m68k-static
# cp -av m68k-linux-user/qemu-m68k /usr/bin/qemu-m68k-static
# ./scripts/qemu-binfmt-conf.sh --systemd m68k --qemu-path /usr/bin --qemu-suffix -static --credential yes --persistent yes

Then just rebooted the machine and it worked.

systemd-binfmt works better for me than Debian's own binfmt-support.

Adrian

-- 
 .''`.  John Paul Adrian Glaubitz
: :' :  Debian Developer - glaubitz@debian.org
`. `'   Freie Universitaet Berlin - glaubitz@physik.fu-berlin.de
  `-    GPG: 62FF 8A75 84E0 2956 9546  0006 7426 3B37 F5B5 F913
>From 30b70d1e6dd1267214aaf960f5154bba8c5f2f99 Mon Sep 17 00:00:00 2001
From: Laurent Vivier <laurent@vivier.eu>
Date: Thu, 11 Jul 2019 00:26:04 +0200
Subject: [PATCH] linux-user: manage binfmt-misc preserve-arg[0] flag

---
 linux-user/main.c           | 16 ++++++++++++++++
 scripts/qemu-binfmt-conf.sh |  2 +-
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/linux-user/main.c b/linux-user/main.c
index a59ae9439d..0e923e150d 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -649,6 +649,9 @@ int main(int argc, char **argv, char **envp)
 
     init_qemu_uname_release();
 
+    /*
+     * Manage binfmt-misc open-binary flag
+     */
     execfd = qemu_getauxval(AT_EXECFD);
     if (execfd == 0) {
         execfd = open(filename, O_RDONLY);
@@ -656,6 +659,19 @@ int main(int argc, char **argv, char **envp)
             printf("Error while loading %s: %s\n", filename, strerror(errno));
             _exit(EXIT_FAILURE);
         }
+    } else {
+        /*
+         * Manage binfmt-misc preserve-arg[0] flag
+         *    argv[optind]     full path to the binary
+         *    argv[optind + 1] original argv[0]
+         */
+        if (optind + 1 < argc) {
+            /*
+             * argv0 with an empty string will set argv[optind + 1]
+             * as target_argv[0]
+             */
+            optind++;
+        }
     }
 
     if (cpu_model == NULL) {
diff --git a/scripts/qemu-binfmt-conf.sh b/scripts/qemu-binfmt-conf.sh
index b5a16742a1..af07a0a186 100755
--- a/scripts/qemu-binfmt-conf.sh
+++ b/scripts/qemu-binfmt-conf.sh
@@ -256,7 +256,7 @@ qemu_check_systemd() {
 qemu_generate_register() {
     flags=""
     if [ "$CREDENTIAL" = "yes" ] ; then
-        flags="OC"
+        flags="OCP"
     fi
     if [ "$PERSISTENT" = "yes" ] ; then
         flags="${flags}F"
-- 
2.20.1


Reply to: