Public bug reported: chrome uses /proc/self/exe to fork render process. Here a simple code to reproduce the issue. It's output parent then child but failed with qemu: unknown option 'type=renderer'.
Maybe we can modify exec syscall to replace /proc/self/exe to the real path. //gcc -o self self.c #include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(int argc, char** argv) { if(argc==1){ printf ("parent\n"); if ( fork() == 0 ) { return execl("/proc/self/exe","/proc/self/exe", "--type=renderer",NULL); } } else { printf ("child\n"); } return 0; } similar reports: https://github.com/AppImage/AppImageKit/issues/965 https://github.com/golang/go/issues/42080 Workardound: compile chrome or your chrome based app with a patch to content/common/child_process_host_impl.cc:GetChildPath, get the realpath of /proc/self/exe: diff --git a/content/common/child_process_host_impl.cc b/content/common/child_process_host_impl.cc index bc78aba80ac8..9fab74d3bae8 100644 --- a/content/common/child_process_host_impl.cc +++ b/content/common/child_process_host_impl.cc @@ -60,8 +60,12 @@ base::FilePath ChildProcessHost::GetChildPath(int flags) { #if defined(OS_LINUX) // Use /proc/self/exe rather than our known binary path so updates // can't swap out the binary from underneath us. - if (child_path.empty() && flags & CHILD_ALLOW_SELF) - child_path = base::FilePath(base::kProcSelfExe); + if (child_path.empty() && flags & CHILD_ALLOW_SELF) { + if (!ReadSymbolicLink(base::FilePath(base::kProcSelfExe), &child_path)) { + NOTREACHED() << "Unable to resolve " << base::kProcSelfExe << "."; + child_path = base::FilePath(base::kProcSelfExe); + } + } #endif // On most platforms, the child executable is the same as the current ** Affects: qemu Importance: Undecided Status: New -- You received this bug notification because you are a member of qemu- devel-ml, which is subscribed to QEMU. https://bugs.launchpad.net/bugs/1926246 Title: chrome based apps can not be run under qemu user mode Status in QEMU: New Bug description: chrome uses /proc/self/exe to fork render process. Here a simple code to reproduce the issue. It's output parent then child but failed with qemu: unknown option 'type=renderer'. Maybe we can modify exec syscall to replace /proc/self/exe to the real path. //gcc -o self self.c #include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(int argc, char** argv) { if(argc==1){ printf ("parent\n"); if ( fork() == 0 ) { return execl("/proc/self/exe","/proc/self/exe", "--type=renderer",NULL); } } else { printf ("child\n"); } return 0; } similar reports: https://github.com/AppImage/AppImageKit/issues/965 https://github.com/golang/go/issues/42080 Workardound: compile chrome or your chrome based app with a patch to content/common/child_process_host_impl.cc:GetChildPath, get the realpath of /proc/self/exe: diff --git a/content/common/child_process_host_impl.cc b/content/common/child_process_host_impl.cc index bc78aba80ac8..9fab74d3bae8 100644 --- a/content/common/child_process_host_impl.cc +++ b/content/common/child_process_host_impl.cc @@ -60,8 +60,12 @@ base::FilePath ChildProcessHost::GetChildPath(int flags) { #if defined(OS_LINUX) // Use /proc/self/exe rather than our known binary path so updates // can't swap out the binary from underneath us. - if (child_path.empty() && flags & CHILD_ALLOW_SELF) - child_path = base::FilePath(base::kProcSelfExe); + if (child_path.empty() && flags & CHILD_ALLOW_SELF) { + if (!ReadSymbolicLink(base::FilePath(base::kProcSelfExe), &child_path)) { + NOTREACHED() << "Unable to resolve " << base::kProcSelfExe << "."; + child_path = base::FilePath(base::kProcSelfExe); + } + } #endif // On most platforms, the child executable is the same as the current To manage notifications about this bug go to: https://bugs.launchpad.net/qemu/+bug/1926246/+subscriptions