
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_PATH
entorno de ejecución del ejecutable de C# a pesar de que paso un puntero envp al execve
llamada al sistema. La forma en que puedo saber que la LD_LIBRARY_PATH
variable 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_PATH
indican 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 strace
para 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 ldd
cualquier 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: