Die Umgebungsvariable LD_LIBRARY_PATH wird von der Laufzeitumgebung der ausführbaren Ziel-C#-Datei nicht erkannt

Die Umgebungsvariable LD_LIBRARY_PATH wird von der Laufzeitumgebung der ausführbaren Ziel-C#-Datei nicht erkannt

Ich habe dieses C++-Programm gestern auf Ubuntu Linux 16.04 getestet. Was mich stört, ist die Tatsache, dass das folgende Programm programmgesteuert einen Monodienst startet, den ich in der Datei /var/log/syslog von Ubuntu 16.04 sehe, aber nicht an LD_LIBRARY_PATHdie Laufzeitumgebung der C#-ausführbaren Datei übergibt, obwohl ich dem execveSystemaufruf einen envp-Zeiger übergebe. Ich erkenne, dass die LD_LIBRARY_PATHUmgebungsvariable von der Laufzeitumgebung der Ziel-ausführbaren Datei nicht erkannt wird, daran, dass sich die Ziel-ausführbare Datei falsch verhält und alle Funktionen überspringt, die LD_LIBRARY_PATHangeben, wo die Abhängigkeiten der Laufzeitbibliothek zu finden sind.

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

}

Ist es möglich, dieses Versehen programmgesteuert mit C++ und der Linux-API zu beheben?

Antwort1

Da es auf Debian/Ubuntu basiert, ist es unwahrscheinlich, dass das Problem an rpath liegt (immer noch möglich). Wahrscheinlicher ist, dass Sie Probleme mit

"LD_LIBRARY_PATH=."

das keinen absoluten Pfadnamen bereitstellt.

Sie können verwenden straceum anzuzeigen, welche Pfade die ausführbare Datei zu öffnen versucht, z. B.

strace -f -o strace.log mono myprogram

und suchen Sie nach den „offenen“ Anrufen.

Im Prinzip können Sie lddjede gemeinsam genutzte ausführbare Datei unter Linux ausführen, z. B.

ldd myprogram

oder (wahrscheinlich)

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

Ebenso gibt objdump nützliche Informationen, z. B.

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

um zu sehen, ob einige der gemeinsam genutzten Bibliotheken über absolute Pfadnamen aufgelöst werden. obdump sollte dies im Abschnitt (seiner Ausgabe) „Dynamische Bibliotheken“ tun.

Die Kommentare inÄquivalent zu ldd für .NET/Mono-Anwendungengeben Sie an, dass Sie möglicherweise ein Tool auf höherer Ebene (und ein anderes Tool) benötigen, um nützliche Informationen zu erhalten, z. B. durch Festlegen einer Umgebungsvariable;

$ MONO_LOG_LEVEL=debug mono myprogram

Weiterführende Literatur:

verwandte Informationen