La variable de entorno LD_LIBRARY_PATH no es reconocida por el entorno de ejecución del ejecutable C# de destino

La variable de entorno LD_LIBRARY_PATH no es reconocida por el entorno de ejecución del ejecutable C# de destino

Ayer probé este programa C++ en Ubuntu Linux 16.04. Lo que me molesta es el hecho de que el siguiente programa inicia un monoservicio mediante programación que veo en el archivo /var/log/syslog de Ubuntu 16.04 pero no logra pasar al LD_LIBRARY_PATHentorno de ejecución del ejecutable de C# a pesar de que paso un puntero envp al execvellamada al sistema. La forma en que puedo saber que la LD_LIBRARY_PATHvariable de entorno no es reconocida por el entorno de ejecución del ejecutable de destino es que el ejecutable de destino se comporta mal y se salta todas las funciones que LD_LIBRARY_PATHindican dónde encontrar las dependencias de la biblioteca de tiempo de ejecución.

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

}

¿Es posible solucionar este descuido mediante programación utilizando C++ y la API de Linux?

Respuesta1

Al estar basado en Debian/Ubuntu, no es probable que el problema se deba a rpath (aún es posible). Lo más probable es que tengas problemas con

"LD_LIBRARY_PATH=."

que no proporciona un nombre de ruta absoluto.

Puede utilizar stracepara mostrar qué rutas intenta abrir el ejecutable, por ejemplo,

strace -f -o strace.log mono myprogram

y busque las convocatorias "abiertas".

En principio, puede ejecutar lddcualquier ejecutable compartido en Linux, por ejemplo,

ldd myprogram

o (probablemente)

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

Asimismo, objdump proporciona información útil, por ejemplo,

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

para ver si alguna de las bibliotecas compartidas se resuelve mediante nombres de ruta absolutos. obdump debería hacerlo en la sección (de su salida) "Bibliotecas dinámicas".

Sin embargo, los comentarios enEquivalente de ldd para aplicaciones .NET/Monoindicar que es posible que necesite una herramienta de nivel superior (y diferente) para obtener información útil, por ejemplo, configurando una variable de entorno;

$ MONO_LOG_LEVEL=debug mono myprogram

Otras lecturas:

información relacionada