我正在执行一个程序,通过先分叉然后执行execve()来说明另一个程序.现在问题是我希望A使用我的库,我通常会使用LD_PRELOAD.我如何在execve()中执行此操作.
谢谢
use*_*419 13
你可以在envp execve的参数中传递LD_PRELOAD:
获得执行的程序,命名为"run":
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
printf("%s\n",getenv("LD_PRELOAD"));
}
Run Code Online (Sandbox Code Playgroud)
执行execve的程序,名为"ex":
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
char *const args[] = {"./run",NULL};
char *const envs[] = {"LD_PRELOAD=caca",NULL};
execve("./run",args,envs);
}
Run Code Online (Sandbox Code Playgroud)
运行它:
root@pinkpony:~# ./ex
ERROR: ld.so: object 'caca' from LD_PRELOAD cannot be preloaded: ignored.
caca
Run Code Online (Sandbox Code Playgroud)
编辑:显示的错误被抛出,因为"caca"lib无法预加载运行,所以它的工作原理.(为了清楚起见,我跳过了fork()部分,但用法是相同的)
编辑:做类似的事情:
LD_PRELOAD=caca ./ex
Run Code Online (Sandbox Code Playgroud)
如果你没有通过envp execve()的参数传递它,那么在execve()运行时不会自动预加载caca lib