
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_PATH
die Laufzeitumgebung der C#-ausführbaren Datei übergibt, obwohl ich dem execve
Systemaufruf einen envp-Zeiger übergebe. Ich erkenne, dass die LD_LIBRARY_PATH
Umgebungsvariable 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_PATH
angeben, 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 strace
um 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 ldd
jede 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: