--- /dev/null
+diff -ur qemu-8.0.3.orig/linux-user/syscall.c qemu-8.0.3/linux-user/syscall.c
+--- qemu-8.0.3.orig/linux-user/syscall.c 2023-07-22 14:27:06.999503109 +0200
++++ qemu-8.0.3/linux-user/syscall.c 2023-07-22 15:21:31.161543522 +0200
+@@ -659,6 +659,7 @@
+ #endif
+ safe_syscall5(int, waitid, idtype_t, idtype, id_t, id, siginfo_t *, infop, \
+ int, options, struct rusage *, rusage)
++safe_syscall3(int, execve, const char *, filename, char **, argv, char **, envp)
+ safe_syscall5(int, execveat, int, dirfd, const char *, filename,
+ char **, argv, char **, envp, int, flags)
+ #if defined(TARGET_NR_select) || defined(TARGET_NR__newselect) || \
+@@ -8388,9 +8389,9 @@
+ return safe_openat(dirfd, path(pathname), flags, mode);
+ }
+
+-static int do_execveat(CPUArchState *cpu_env, int dirfd,
+- abi_long pathname, abi_long guest_argp,
+- abi_long guest_envp, int flags)
++static int do_execv(CPUArchState *cpu_env, int dirfd,
++ abi_long pathname, abi_long guest_argp,
++ abi_long guest_envp, int flags, bool is_execveat)
+ {
+ int ret;
+ char **argp, **envp;
+@@ -8469,11 +8470,14 @@
+ goto execve_efault;
+ }
+
++ const char *exe = p;
+ if (is_proc_myself(p, "exe")) {
+- ret = get_errno(safe_execveat(dirfd, exec_path, argp, envp, flags));
+- } else {
+- ret = get_errno(safe_execveat(dirfd, p, argp, envp, flags));
++ exe = exec_path;
+ }
++ ret = is_execveat
++ ? safe_execveat(dirfd, exe, argp, envp, flags)
++ : safe_execve(exe, argp, envp);
++ ret = get_errno(ret);
+
+ unlock_user(p, pathname, 0);
+
+@@ -9012,9 +9016,9 @@
+ return ret;
+ #endif
+ case TARGET_NR_execveat:
+- return do_execveat(cpu_env, arg1, arg2, arg3, arg4, arg5);
++ return do_execv(cpu_env, arg1, arg2, arg3, arg4, arg5, true);
+ case TARGET_NR_execve:
+- return do_execveat(cpu_env, AT_FDCWD, arg1, arg2, arg3, 0);
++ return do_execv(cpu_env, AT_FDCWD, arg1, arg2, arg3, 0, false);
+ case TARGET_NR_chdir:
+ if (!(p = lock_user_string(arg1)))
+ return -TARGET_EFAULT;