A variável de ambiente LD_LIBRARY_PATH não é reconhecida pelo ambiente de tempo de execução do executável C# de destino

A variável de ambiente LD_LIBRARY_PATH não é reconhecida pelo ambiente de tempo de execução do executável C# de destino

Testei este programa C++ no Ubuntu Linux 16.04 ontem. O que me incomoda é o fato de que o programa a seguir inicia um mono-serviço programaticamente que vejo no arquivo /var/log/syslog do Ubuntu 16.04, mas não consegue passar LD_LIBRARY_PATHpara o ambiente de tempo de execução do executável C#, mesmo que eu passe um ponteiro envp para o execvechamada do sistema. A maneira como posso saber se a LD_LIBRARY_PATHvariável de ambiente não é reconhecida pelo ambiente de tempo de execução do executável de destino é que o executável de destino está se comportando mal e ignorando todas as funções onde LD_LIBRARY_PATHinforma onde encontrar as dependências da biblioteca de tempo de execução.

#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;

}

É possível corrigir esse descuido programaticamente usando C++ e a API Linux?

Responder1

Sendo baseado em Debian/Ubuntu, não é provável que o problema seja devido ao rpath (ainda possível). É mais provável que você esteja tendo problemas com

"LD_LIBRARY_PATH=."

que não fornece um nome de caminho absoluto.

Você pode usar stracepara mostrar quais caminhos o executável tenta abrir, por exemplo,

strace -f -o strace.log mono myprogram

e procure as chamadas "abertas".

Em princípio, você pode executar lddem qualquer executável compartilhado no Linux, por exemplo,

ldd myprogram

ou (provavelmente)

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

Da mesma forma, objdump fornece informações úteis, por exemplo,

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

para ver se alguma das bibliotecas compartilhadas é resolvida por meio de nomes de caminho absolutos. obdump deveria estar na seção (de sua saída) "Bibliotecas dinâmicas".

No entanto, os comentários emEquivalente a ldd para aplicativos .NET/Monoindique que você pode precisar de uma ferramenta de nível superior (e diferente) para obter informações úteis, por exemplo, definindo uma variável de ambiente;

$ MONO_LOG_LEVEL=debug mono myprogram

Leitura adicional:

informação relacionada