Переменная среды LD_LIBRARY_PATH не распознается средой выполнения целевого исполняемого файла C#

Переменная среды LD_LIBRARY_PATH не распознается средой выполнения целевого исполняемого файла C#

Вчера я протестировал эту программу C++ на Ubuntu Linux 16.04. Меня беспокоит тот факт, что следующая программа программно запускает моносервис, который я вижу в файле Ubuntu 16.04 /var/log/syslog, но не может передать в LD_LIBRARY_PATHсреду выполнения исполняемого файла C#, хотя я передаю указатель envp в execveсистемный вызов. Способ, которым я могу определить, что LD_LIBRARY_PATHпеременная окружения не распознается средой выполнения целевого исполняемого файла, заключается в том, что целевой исполняемый файл ведет себя неправильно и пропускает все функции, где LD_LIBRARY_PATHуказывается, где найти зависимости библиотеки времени выполнения.

#include <unistd.h>     // execv(), fork()
#include <sys/types.h>  // pid_t
#include <sys/wait.h>   // waitpid()
#include <stdio.h>

int main(int argc, char* argvp)
{
   char *argv[] = { "/usr/lib/mono/4.5/mono-service.exe",
                    "Audio_Video_Recorder.exe", 0};


    char *envp[] =
    {
        "LD_LIBRARY_PATH=.",
        0
    };
    execve(argv[0], &argv[0], envp);
    fprintf(stderr, "Oops!\n");
    return -1;

}

Можно ли исправить эту оплошность программно, используя C++ и Linux API?

решение1

Поскольку Debian/Ubuntu основан, маловероятно, что проблема связана с rpath (хотя это возможно). Скорее всего, у вас проблемы с

"LD_LIBRARY_PATH=."

который не предоставляет абсолютного пути.

Вы можете использовать , straceчтобы показать, какие пути исполняемый файл пытается открыть, например,

strace -f -o strace.log mono myprogram

и ищите «открытые» вызовы.

В принципе, вы можете запустить lddлюбой общий исполняемый файл в Linux, например,

ldd myprogram

или (вероятно)

ldd /usr/lib/mono/4.5/mono-service.exe

Аналогично, objdump дает полезную информацию, например,

objdump -ax /usr/lib/mono/4.5/mono-service.exe

чтобы увидеть, разрешены ли какие-либо общие библиотеки с помощью абсолютных путей. obdump должен указать это в разделе (своего вывода) «Динамические библиотеки».

Однако комментарии вЭквивалент ldd для приложений .NET/Monoуказывают, что вам может потребоваться инструмент более высокого уровня (и другой инструмент) для получения полезной информации, например, путем установки переменной среды;

$ MONO_LOG_LEVEL=debug mono myprogram

Дальнейшее чтение:

Связанный контент