Trapping into the execve() API – via perf and eBPF tooling
On Linux (and UNIX), user mode applications – processes – are launched or executed via a family of so-called exec
C library (glibc) APIs: execl()
, execlp()
, execv()
, execvp()
, execle()
, execvpe()
, and execve()
.
A quick couple of things to know about these seven APIs: the first six are merely glibc wrappers that transform their arguments and ultimately invoke the execve()
API – it is the actual system call, the one that causes the process context to switch to kernel mode and run the kernel code corresponding to the system call. Also, FYI, execvpe()
is a GNU extension (and thus practically only seen on Linux).
The point here is simply this: ultimately, pretty much all processes (and thus apps) are executed via the kernel code of execve()
! Within the kernel, execve()
becomes the sys_execve()
function (in a bit of an indirect fashion, via the SYSCALL_DEFINE3()
macro), which invokes the actual worker...