
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_PATH
para o ambiente de tempo de execução do executável C#, mesmo que eu passe um ponteiro envp para o execve
chamada do sistema. A maneira como posso saber se a LD_LIBRARY_PATH
variá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_PATH
informa 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 strace
para 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 ldd
em 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: