From nobody Tue Feb 10 08:31:24 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1615629101; cv=none; d=zohomail.com; s=zohoarc; b=DMGuJ/4bepe9wGFHb+YUQz+hXTLOODN1iZJAUF+eNp72By3gWtyEjZOvWe8e0OXmCr93lr5ZKodhTZeREAdFgzWrRezoYbjVAPW2Yyd5DJcOypum4hSOW7gPpi3cr+K9zSxAUT9bok6le66W+n20zs9XqF7kxQLO60Ecii1rM0Y= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1615629101; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=oUYzJm1TYOf+NMr/S3d0jIXSjOOw2QE4BmJWRor56VM=; b=CWQEX8Vprf6BGkqKNM3WshWtZc5oR3y/xCohClWOAusqutMtotyjqPP3lMD0iTqkOHap/XN5fm3wjvIJhoASON5vg/MnQzf/KJbuyTy/b5xZ5Kfie0R9/YJdiwfVsh0Ow/AjZjflC5S2DXl/qcGLvDKfwuefzs4a9Z2Q7kdqfVE= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1615629101966700.2099950717006; Sat, 13 Mar 2021 01:51:41 -0800 (PST) Received: from localhost ([::1]:50494 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lL0vs-0003w5-Rg for importer@patchew.org; Sat, 13 Mar 2021 04:51:40 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:34012) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lL0sO-00079l-41 for qemu-devel@nongnu.org; Sat, 13 Mar 2021 04:48:05 -0500 Received: from mout.kundenserver.de ([217.72.192.75]:53255) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lL0sG-00075F-7p for qemu-devel@nongnu.org; Sat, 13 Mar 2021 04:48:03 -0500 Received: from localhost.localdomain ([82.142.6.26]) by mrelayeu.kundenserver.de (mreue106 [212.227.15.183]) with ESMTPSA (Nemesis) id 1MIxmm-1l1p1x3Rzm-00KQ9s; Sat, 13 Mar 2021 10:47:52 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Subject: [PULL 2/5] linux-user: manage binfmt-misc preserve-arg[0] flag Date: Sat, 13 Mar 2021 10:47:44 +0100 Message-Id: <20210313094747.2966948-3-laurent@vivier.eu> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210313094747.2966948-1-laurent@vivier.eu> References: <20210313094747.2966948-1-laurent@vivier.eu> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:mkx6O8zonY+ER/ILzpH+S33Zyi1sZKYSYXbvoeYT/8qP4uG1Hip KsKKS6jyfiR6VZXm2KypevkKoyMkEMkWqtpF6rgMbZOkLKt+h4C7vypPuK9GRAYlscEpFs6 8+2c7oTg9FXm81f8YT6IzKy6th1m0cUWBhloSkL0ecmiLcbuNMcjTz/6hlpKbkO2k/HqsVo tbo7e7jAqmWLHGMeFxRqA== X-UI-Out-Filterresults: notjunk:1;V03:K0:wDHJySUTVaE=:ntwzGflAGX+n0H9QzIU38b xLHka3dEWRS6L9TMMGTy7hoWYsZfOoBUiirIMppliaoTlX5lMMPXFC6ZkdhD3AWaXrRm0zvT3 Cq4onWpSpgVd5ndJ/9E2hu/S+ycHPp38odHk6XpJzWlUfRUHXv+4RSgBbYRiO9341X09p3CIc YoB37erWWzLZxmyHb7sj9M+5BCTkutz5hg949Xz9ScncqMq0x36/6+Msm8Fy3Q8HRQGnBFfpb rLAfOXk5K1WozgXPzzxOXCJWtDBtVdjgCT5ub5nh96rPJjlDk1dBTtbmsCzLTlQGBLPeXnl2T OPNLzlfdfElLdz1JewK9egVMevX8QpIpYUTdC301Q0GLOmw1tVvnaAA9GTZkZU2f4Pk9pz/EQ 6ek9KEEDGF/JV9Jk8v3Oe4JcC4Az8H2dVirfxy/QELvrC6XzQnO7PFYN5rafUFyw06g6IthO6 nBYzdihQDQ== Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: none client-ip=217.72.192.75; envelope-from=laurent@vivier.eu; helo=mout.kundenserver.de X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laurent Vivier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Add --preserve-argv0 in qemu-binfmt-conf.sh to configure the preserve-argv0 flag. This patch allows to use new flag in AT_FLAGS to detect if preserve-argv0 is configured for this interpreter: argv[0] (the full pathname provided by binfmt-misc) is removed and replaced by argv[1] (the original argv[0] provided by binfmt-misc when 'P'/preserve-arg[0] is set) For instance with this patch and kernel support for AT_FLAGS: $ sudo chroot m68k-chroot sh -c 'echo $0' sh without this patch: $ sudo chroot m68k-chroot sh -c 'echo $0' /usr/bin/sh The new flag is available in kernel (v5.12) since: 2347961b11d4 ("binfmt_misc: pass binfmt_misc flags to the interpreter") This can be tested with something like: # cp ..../qemu-ppc /chroot/powerpc/jessie # qemu-binfmt-conf.sh --qemu-path / --systemd ppc --credential yes \ --persistent no --preserve-argv0 yes # systemctl restart systemd-binfmt.service # cat /proc/sys/fs/binfmt_misc/qemu-ppc enabled interpreter //qemu-ppc flags: POC offset 0 magic 7f454c4601020100000000000000000000020014 mask ffffffffffffff00fffffffffffffffffffeffff # chroot /chroot/powerpc/jessie sh -c 'echo $0' sh # qemu-binfmt-conf.sh --qemu-path / --systemd ppc --credential yes \ --persistent no --preserve-argv0 no # systemctl restart systemd-binfmt.service # cat /proc/sys/fs/binfmt_misc/qemu-ppc enabled interpreter //qemu-ppc flags: OC offset 0 magic 7f454c4601020100000000000000000000020014 mask ffffffffffffff00fffffffffffffffffffeffff # chroot /chroot/powerpc/jessie sh -c 'echo $0' /bin/sh Signed-off-by: Laurent Vivier Message-Id: <20210222105004.1642234-1-laurent@vivier.eu> --- linux-user/main.c | 24 ++++++++++++++++++++ scripts/qemu-binfmt-conf.sh | 44 +++++++++++++++++++++++-------------- 2 files changed, 51 insertions(+), 17 deletions(-) diff --git a/linux-user/main.c b/linux-user/main.c index 4f4746dce825..f956afccab62 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -26,6 +26,7 @@ #include #include #include +#include =20 #include "qapi/error.h" #include "qemu.h" @@ -49,6 +50,11 @@ #include "cpu_loop-common.h" #include "crypto/init.h" =20 +#ifndef AT_FLAGS_PRESERVE_ARGV0 +#define AT_FLAGS_PRESERVE_ARGV0_BIT 0 +#define AT_FLAGS_PRESERVE_ARGV0 (1 << AT_FLAGS_PRESERVE_ARGV0_BIT) +#endif + char *exec_path; =20 int singlestep; @@ -632,6 +638,7 @@ int main(int argc, char **argv, char **envp) int execfd; int log_mask; unsigned long max_reserved_va; + bool preserve_argv0; =20 error_init(argv[0]); module_call_init(MODULE_INIT_TRACE); @@ -688,6 +695,9 @@ int main(int argc, char **argv, char **envp) =20 init_qemu_uname_release(); =20 + /* + * Manage binfmt-misc open-binary flag + */ execfd =3D qemu_getauxval(AT_EXECFD); if (execfd =3D=3D 0) { execfd =3D open(exec_path, O_RDONLY); @@ -697,6 +707,20 @@ int main(int argc, char **argv, char **envp) } } =20 + /* + * get binfmt_misc flags + */ + preserve_argv0 =3D !!(qemu_getauxval(AT_FLAGS) & AT_FLAGS_PRESERVE_ARG= V0); + + /* + * Manage binfmt-misc preserve-arg[0] flag + * argv[optind] full path to the binary + * argv[optind + 1] original argv[0] + */ + if (optind + 1 < argc && preserve_argv0) { + optind++; + } + if (cpu_model =3D=3D NULL) { cpu_model =3D cpu_get_model(get_elf_eflags(execfd)); } diff --git a/scripts/qemu-binfmt-conf.sh b/scripts/qemu-binfmt-conf.sh index 7b5d54b88741..573b5dc6acd7 100755 --- a/scripts/qemu-binfmt-conf.sh +++ b/scripts/qemu-binfmt-conf.sh @@ -178,25 +178,27 @@ usage() { Usage: qemu-binfmt-conf.sh [--qemu-path PATH][--debian][--systemd CPU] [--help][--credential yes|no][--exportdir PATH] [--persistent yes|no][--qemu-suffix SUFFIX] + [--preserve-argv0 yes|no] =20 Configure binfmt_misc to use qemu interpreter =20 - --help: display this usage - --qemu-path: set path to qemu interpreter ($QEMU_PATH) - --qemu-suffix: add a suffix to the default interpreter name - --debian: don't write into /proc, - instead generate update-binfmts templates - --systemd: don't write into /proc, - instead generate file for systemd-binfmt.service - for the given CPU. If CPU is "ALL", generate a - file for all known cpus - --exportdir: define where to write configuration files - (default: $SYSTEMDDIR or $DEBIANDIR) - --credential: if yes, credential and security tokens are - calculated according to the binary to interpret - --persistent: if yes, the interpreter is loaded when binfmt is - configured and remains in memory. All future uses - are cloned from the open file. + --help: display this usage + --qemu-path: set path to qemu interpreter ($QEMU_PATH) + --qemu-suffix: add a suffix to the default interpreter name + --debian: don't write into /proc, + instead generate update-binfmts templates + --systemd: don't write into /proc, + instead generate file for systemd-binfmt.service + for the given CPU. If CPU is "ALL", generate a + file for all known cpus + --exportdir: define where to write configuration files + (default: $SYSTEMDDIR or $DEBIANDIR) + --credential: if yes, credential and security tokens are + calculated according to the binary to interpret + --persistent: if yes, the interpreter is loaded when binfmt is + configured and remains in memory. All future uses + are cloned from the open file. + --preserve-argv0 preserve argv[0] =20 To import templates with update-binfmts, use : =20 @@ -269,6 +271,9 @@ qemu_generate_register() { if [ "$PERSISTENT" =3D "yes" ] ; then flags=3D"${flags}F" fi + if [ "$PRESERVE_ARG0" =3D "yes" ] ; then + flags=3D"${flags}P" + fi =20 echo ":qemu-$cpu:M::$magic:$mask:$qemu:$flags" } @@ -330,9 +335,10 @@ DEBIANDIR=3D"/usr/share/binfmts" QEMU_PATH=3D/usr/local/bin CREDENTIAL=3Dno PERSISTENT=3Dno +PRESERVE_ARG0=3Dno QEMU_SUFFIX=3D"" =20 -options=3D$(getopt -o ds:Q:S:e:hc:p: -l debian,systemd:,qemu-path:,qemu-su= ffix:,exportdir:,help,credential:,persistent: -- "$@") +options=3D$(getopt -o ds:Q:S:e:hc:p:g: -l debian,systemd:,qemu-path:,qemu-= suffix:,exportdir:,help,credential:,persistent:,preserve-argv0: -- "$@") eval set -- "$options" =20 while true ; do @@ -388,6 +394,10 @@ while true ; do shift PERSISTENT=3D"$1" ;; + -g|--preserve-argv0) + shift + PRESERVE_ARG0=3D"$1" + ;; *) break ;; --=20 2.29.2