
Вчера я протестировал эту программу 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
Дальнейшее чтение: