可以执行文件的GLIBC功能的完整列表execv,execve,fexecve,posix_spawn等

问题描述

我正在编写一个LD_PRELOAD实用程序,该实用程序包装了对exec()类型函数的所有调用

但是圣牛,有很多。到目前为止,我已经发现:

execvexecvp,execve,execvpe fexecve,execveat, execl,execlp,execle,execlpe, posix_spawn,posix_spawnp

在执行另一个程序的所有lib函数的某处是否有详尽的清单(不仅是这些函数之一的包装)?

作为示例,我刚刚发现IPC :: Open3使用的perl库不在上面的列表中,因此我看不到发生的exec。 (strace可以看到它,但是它声称上面列表中的所有内容都只是“ execve”,实际上并不正确。)

解决方法

至少在我的(Debian GNU / Linux)系统上,execve系统调用来自Perl调用execvp

#0  0x00007ffff7d35787 in execve () at ../sysdeps/unix/syscall-template.S:120
#1  0x00007ffff7d3603b in __execvpe_common (file=0x5555559ee710 "some",argv=0x5555558e31f0,envp=0x5555558c6980,exec_script=<optimized out>) at execvpe.c:136
#2  0x00005555556bcf50 in Perl_do_aexec5 ()
#3  0x00005555556b14ef in Perl_pp_exec ()
#4  0x0000555555652cf6 in Perl_runops_standard ()
#5  0x00005555555c6a6c in perl_run ()
#6  0x000055555559c472 in main ()
(gdb) fr 2

#2  0x00005555556bcf50 in Perl_do_aexec5 ()
(gdb) x/i $pc-5
   0x5555556bcf4b <Perl_do_aexec5+427>: callq  0x55555559b2c0 <execvp@plt>

使用ltrace还会确认:

ltrace -f --library=libc.so.6  perl foo.pl |& grep execv
[pid 1789012] perl->execvp(0x55cd3c4a4bc0,0x55cd3c3a28e0,0x7fff82e61770,0x7fd4f3317212) = 0xffffffff
...