如何在 linux 上调用 execve?

How is execve invoked on linux?

如果您在 linux 上调用 exec(...),它最终会调用 execve(),然后调用 sys_execve(),然后调用 do_execve,然后遍历处理程序列表,直到找到一个匹配的处理程序(binfmt_elf.c 中有一个默认的精灵处理程序)。

另一方面,如果您查看 glibc 的源代码,那么 execve() 调用 hurd_exec(),然后调用 __file_exec(我找不到).它看起来最终会在 dl-open.c 中结束,但我找不到在两者之间运行的代码。

我假设用户空间程序总是从库中调用版本,在这种情况下,__file_exec 去哪里?我在内核或 glibc 代码中找不到对它的引用...

注意:这是针对 armv8,linux3.10.

On the other hand, if you look at the source for glibc, then execve() calls hurd_exec()

Linux 没有,它没有。

您可能正在查看 sysdeps/mach/hurd/execve.c,但在 Linux 上您应该查看 sysdeps/unix/sysv/linux/execve.c,它调用 INLINE_SYSCALL (execve, ...);,它会执行您期望的操作:通过控制内核。