2016-06-07 7 views
1

Ich versuche eine ausführbare Datei - SaTScanBatch, ausführbare Datei der SaTScan-Software - auf einem Remote-Computer vom Terminal aus auszuführen. HierlibstdC++.so.6: Version nicht gefunden - KEINE Admin-Rechte

ist der Fehler, den ich

bekommen

/usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.15' not found

Das Problem ist ähnlich wie diese: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found oder How to fix: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found oder /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found

Was in meinem Fall anders ist, ist, dass ich keine Administratorrechte haben , also kann ich keine Bibliotheken in der usr/lib-Datei hinzufügen. Ich habe libstdC++. 6.0.15 in mein Remote-Repository heruntergeladen und möchte damit meine Datei ausführen.

Hier sind die Möglichkeiten, die ich

versucht

i) ändern Umgebungsvariable LD_LIBRARY_PATH oder LD_RUN_PATH oder LD_PRELOAD auf den Pfad der libstdC++. So.6.0.15. -> Hat irgendetwas nicht

ii)

gcc SaTScanBatch -static-libstdc++ 

die Bibliothek in einer statischen Art und Weise einschließen ändern -> -static Option nicht erkannt wird, ich die Remote-Maschine GCC Version erraten zu alt ist.

iii) Versuchen Sie die Datei auf die zusätzliche Bibliothek zu verknüpfen:

gcc SaTScanBatch -L /path/library -l stdc++ 

oder ähnlich

gcc SaTScanBatch -Wl,-rpath,path/to/library 

-> Fehler

/usr/bin/ld: warning: Cannot create .eh_frame_hdr section, --eh-frame-hdr ignored. 
/usr/bin/ld: error in SaTScanBatch64(.eh_frame); no .eh_frame_hdr table will be created. 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../lib64/crt1.o: In function _start: 
(.text+0x20): undefined reference to "main" 
collect2: ld returned 1 exit status 

iv) Verwenden PatchElf die Verknüpfung Datei und die Bibliothek -> Ich kann PatchElf nicht installieren, da keine Administratorrechte

Vielen Dank für jede Anregung!

Antwort

0

Ändern Sie die Umgebungsvariable LD_LIBRARY_PATH oder LD_RUN_PATH oder LD_PRELOAD in den Pfad von libstdC++. So.6.0.15. -> Hat nichts verändert

Was genau haben Sie versucht?

LD_LIBRARY_PATH sollte die neue enthalten libstdc++.so.6 nicht die Datei selbst, und Sie müssen export die Umgebungsvariable auf das Verzeichnis gesetzt werden, damit es zu Child-Prozesse zur Verfügung steht, nicht nur auf die Shell. Und Sie brauchen einen Symlink von libstdc++.so.6 zu libstdc++.so.6.0.15 weil der dynamische Lader für diesen Namen aussehen wird, nicht libstdc++.so.6.0.15

LD_RUN_PATHverwendet wird während der Verknüpfung einen Weg in die ausführbare Datei zu backen. Zur Laufzeit wird nichts ausgeführt, wenn versucht wird, die ausführbare Datei auszuführen. Wenn Sie es verwenden, müssen Sie es in das Verzeichnis setzen, das die libstdc++.so.6 Datei auf dem Remote-Computer enthält. Auch hier muss es auf ein Verzeichnis und nicht auf den Pfad der Datei eingestellt werden.

LD_PRELOAD ist wieder etwas anderes, und fast sicher nicht das, was Sie wollen. Sie würden es verwenden, um zu erzwingen, dass eine bestimmte gemeinsam genutzte Bibliothek vor allem anderen geladen wird, wenn die ausführbare Datei ausgeführt wird. Dies kann verwendet werden, um ein neueres libstdC++ vorzuladen, aber es ist normalerweise besser, LD_LIBRARY_PATH zu verwenden, um einen Pfad zur Laufzeit zu setzen oder LD_RUN_PATH, um einen Pfad zur Verbindungszeit zu setzen.

versuchen, die Datei auf die zusätzliche Bibliothek zu verknüpfen:

Die Befehle sind Unsinn zeigte sie keine Objekte in den Link enthalten, so dass Sie versuchen, eine ausführbare Datei erstellen aus von nichts. Deshalb erhalten Sie den Fehler undefined reference to "main"

Für Ihr Szenario würde ich empfehlen, LD_LIBRARY_PATH zu verwenden.

Verwandte Themen