Хотите, чтобы execve () выполнял исполняемый файл, чтобы использовать мою предварительно загруженную библиотеку - PullRequest
11 голосов
/ 16 мая 2011

Я выполняю программу скажем A из другой, сначала разветвившись, а затем execve (). Теперь проблема в том, что я хотел бы, чтобы A использовал мою библиотеку, которую я обычно делал бы с помощью LD_PRELOAD. Как мне сделать это в execve ().

Спасибо

Ответы [ 3 ]

11 голосов
/ 16 мая 2011

вы можете передать 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 ()

0 голосов
/ 16 мая 2011

Если вы хотите использовать LD_PRELOAD только для программы A (а не для ее родителя), вы можете загрузить ее через оболочку;передайте в оболочку имя программы для выполнения и добавьте в среду LD_PRELOAD.

0 голосов
/ 16 мая 2011

Обновление

После прочтения добавленной информации из вопроса, я предполагаю, что вам, возможно, придется указать полный путь или также установить LD_LIBRARY_PATH? Поскольку загрузчик является , подтверждая тот факт, что предварительная загрузка заказана.

В противном случае, я могу представить, что существует ограничение безопасности (хотя оно должно быть привязано к запуску, вызываемому из оболочки входа в систему, что кажется довольно хрупким для обнаружения). Тем не менее, вы можете попробовать запустить от имени пользователя root (используйте sudo -E, чтобы сохранить вашу среду)


Из этого более раннего вопроса следует, что такое поведение используется по умолчанию

LD_PRELOAD влияет на нового ребенка даже после unsetenv ("LD_PRELOAD")

Вы проверяли это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...