On Wed, Nov 6, 2024 at 3:38 AM Richard Henderson <richard.hender...@linaro.org> wrote: > > On 11/5/24 23:54, Noah Goldstein wrote: > >>> You still need to handle is_proc_myself, for the guest binary. > > > > Would this by handled by basically do: > > > > ``` > > if (is_proc_myself(p, "exe")) { > > exe = exec_path; > > if (through_qemu) > > argp[argp_offset] = exec_path; > > } > > ``` > > Or am I missing something? > > Something like that, yes. > > >>> I wonder if those two cases are related. Do we need to also add an > >>> argument so that we > >>> can pass the executable to the next qemu via file descriptor? I.e. > >>> execvat becomes > >>> > >>> f = openat() > >>> execv(qemu, "-execfd", f) > >>> > >>> and is_proc_myself uses execfd, which we already have open. > > > > How does passing a fd from one process to another work? > As long as the fd is not marked O_CLOEXEC, it stays open in the new process. > Providing > the number via command-line, or whatever, is sufficient for the new process > to know what > is going on.
Err I guess I was thinking its a bit weird having an option that is only really applicable if qemu is a child process. I.e the `-execfd` argument is not usable from commandline. > > I now realize this is necessary for the AT_EMPTY_PATH flag, where we only > have the file > descriptor. We could also do something along the lines of: ``` fd = openat(dirfd, exe); char new_exe[PATH_MAX]; char fd_path[PATH_MAX]; sprintf(fd_path, "/proc/self/fd/%d", fd); readlink(fd_path, new_exe, PATH_MAX); exe = new_exe; ``` > > > r~