想要execve()的excutable运行来使用我预加载的库

Lip*_*eka 12 c linux fork

我正在执行一个程序,通过先分叉然后执行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