Public bug reported:

I've found a regression in qemu-user-static. I'm using binfmt to run
riscv64 application on an x86-64.

Steps to reproduce (using golang for ease of cross-compiling):
--
$ cat rv.go
package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Println("Args are");
    for i, a := range os.Args {
        fmt.Println(i, a);
    }
}
$ go build ./rv.go
$ ./rv one two three
Args are
0 ./rv
1 one
2 two
3 three
$ export GOARCH=riscv64
$ go build ./rv.go
$ file ./rv
./rv: ELF 64-bit LSB executable, UCB RISC-V, version 1 (SYSV),
statically linked, Go
BuildID=9kA-_aeKgZkwtyYVUb7o/F43JNW5XxPX9ScBQrfs8/l6EzXXq8x8pfor-ByIh4/_zELq4T9-VKcpBXoempb,
not stripped
$ ./rv
Args are
0 ./rv
$ ./rv one
Args are
0 ./rv
$ ./rv one two three four
Args are
0 ./rv
1 two
2 three
3 four
$
--

As you can see, in the last run, the "one" argument is skipped.

There is a debian patch, linux-user-binfmt-P.diff (found in
qemu_6.0+dfsg-2expubuntu1.debian.tar.xz), that I think is the issue.

When we execute the binfmt-interpreter directly:
$ /usr/libexec/qemu-binfmt/riscv64-binfmt-P /path/to/rv /path/to/rv one two
Args are
0 /path/to/rv
1 one
2 two

Things work, however via the kernels binfmt-misc:
$ /path/to/rv one two
Args are
0 /path/to/rv
1 two

It doesn't.
 
$ cat /proc/sys/fs/binfmt_misc/qemu-riscv64 
enabled
interpreter /usr/libexec/qemu-binfmt/riscv64-binfmt-P
flags: POCF
offset 0
magic 7f454c460201010000000000000000000200f300
mask ffffffffffffff00fffffffffffffffffeffffff

Note that the 'P' flag is set.

From the qemu code (linux-user/main.c):
    /*
     * get binfmt_misc flags
     */
    preserve_argv0 = !!(qemu_getauxval(AT_FLAGS) & AT_FLAGS_PRESERVE_ARGV0);

    /*
     * 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++;
    }

Here, having P enabled will skip the argument.

I believe the debian patch needs to be reworked
(https://lists.gnu.org/archive/html/qemu-devel/2021-02/msg04639.html).

ProblemType: Bug
DistroRelease: Ubuntu 21.10
Package: qemu-user-static 1:6.0+dfsg-2expubuntu1
ProcVersionSignature: Ubuntu 5.13.0-20.20-generic 5.13.14
Uname: Linux 5.13.0-20-generic x86_64
ApportVersion: 2.20.11-0ubuntu71
Architecture: amd64
CasperMD5CheckResult: pass
CurrentDesktop: ubuntu:GNOME
Date: Mon Oct 25 17:02:34 2021
InstallationDate: Installed on 2021-05-28 (149 days ago)
InstallationMedia: Ubuntu 21.04 "Hirsute Hippo" - Release amd64 (20210420)
KvmCmdLine: COMMAND         STAT  EUID  RUID     PID    PPID %CPU COMMAND
MachineType: LENOVO 20W0CTO1WW
ProcKernelCmdLine: BOOT_IMAGE=/vmlinuz-5.13.0-20-generic 
root=/dev/mapper/vgubuntu-root ro quiet splash vt.handoff=7
SourcePackage: qemu
UpgradeStatus: Upgraded to impish on 2021-10-21 (4 days ago)
dmi.bios.date: 09/07/2021
dmi.bios.release: 1.43
dmi.bios.vendor: LENOVO
dmi.bios.version: N34ET43W (1.43 )
dmi.board.asset.tag: Not Available
dmi.board.name: 20W0CTO1WW
dmi.board.vendor: LENOVO
dmi.board.version: Not Defined
dmi.chassis.asset.tag: No Asset Information
dmi.chassis.type: 10
dmi.chassis.vendor: LENOVO
dmi.chassis.version: None
dmi.ec.firmware.release: 1.8
dmi.modalias: 
dmi:bvnLENOVO:bvrN34ET43W(1.43):bd09/07/2021:br1.43:efr1.8:svnLENOVO:pn20W0CTO1WW:pvrThinkPadT14Gen2i:skuLENOVO_MT_20W0_BU_Think_FM_ThinkPadT14Gen2i:rvnLENOVO:rn20W0CTO1WW:rvrNotDefined:cvnLENOVO:ct10:cvrNone:
dmi.product.family: ThinkPad T14 Gen 2i
dmi.product.name: 20W0CTO1WW
dmi.product.sku: LENOVO_MT_20W0_BU_Think_FM_ThinkPad T14 Gen 2i
dmi.product.version: ThinkPad T14 Gen 2i
dmi.sys.vendor: LENOVO

** Affects: qemu (Ubuntu)
     Importance: Undecided
         Status: New


** Tags: amd64 apport-bug impish wayland-session

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1948684

Title:
  qemu-user-static/binfmt skips first argument

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/qemu/+bug/1948684/+subscriptions


-- 
ubuntu-bugs mailing list
ubuntu-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to