如何在 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, ...);
,它会执行您期望的操作:通过控制内核。
如果您在 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, ...);
,它会执行您期望的操作:通过控制内核。