вы можете передать LD_PRELOAD в аргументе envp execve:
программа, которая выполняется, с именем "run":
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
printf("%s\n",getenv("LD_PRELOAD"));
}
программа, которая выполняет 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);
}
при его запуске:
root@pinkpony:~# ./ex
ERROR: ld.so: object 'caca' from LD_PRELOAD cannot be preloaded: ignored.
caca
РЕДАКТИРОВАТЬ: отображается ошибка появляется, потому что lib "caca" не может быть предварительно загружен для запуска, поэтому он работает.(Я пропустил часть fork () для ясности, но использование то же самое)
РЕДАКТИРОВАТЬ: делая что-то вроде:
LD_PRELOAD=caca ./ex
не будет автоматически предварительно загружать caca lib при execve ()запустить, если вы не передаете его через аргумент envp execve ()