Ignorieren Sie ld_library_path und bleiben
-
18-09-2019 - |
Frage
Ich sitze in einer Umgebung, über die ich keine wirkliche Kontrolle habe (es bin nicht nur ich, also kann ich die Umgebung nicht ändern oder es funktioniert für niemanden), das einzige, was ich beeinflussen kann, ist, wie die Binär wird gebaut.
Mein Problem ist, dass die Umgebung einen ld_library_path mit einem libstdc ++ enthält, das nicht mit dem verwendeten Compiler kompatibel ist. Ich habe versucht, es statisch zu kompilieren, aber das scheint für G ++ nicht möglich zu sein (Version 4.2.3, scheint in späteren Versionen in dieser Richtung gearbeitet zu haben, die jedoch nicht verfügbar sind, -static -libstdc ++ oder ähnliches).
Jetzt bin ich angekommen, um RPath zu verwenden, um den absoluten Pfadnamen in die ausführbare Datei zu backen (würden alle Maschinen funktionieren, auf denen er laufen soll, sind identisch). Leider sieht es so aus, als ob LD_LIBRARY_PATH Vorrang vor RPATH hat (zurückzusetzen ld_library_path bestätigt, dass sie in der Lage ist, die Bibliothek zu finden, aber wie oben erwähnt, wird ld_library_path für alle festgelegt, und ich kann das nicht ändern).
Gibt es eine Möglichkeit, dass ich RPath vor LD_LIBRARY_PATH vorrangigen kann, oder gibt es andere mögliche Lösungen für mein Problem? Beachten Sie, dass ich zur Laufzeit über dynamische Verknüpfungen spreche. Ich kann die Befehlszeile bei Compile und Link Time steuern.
Vielen Dank.
Lösung
Verknüpfung gegen libstdc++.a
ist definitiv möglich, wenn auch schwierig. Anweisungen hier.
Ich bin ein bisschen skeptisch gegenüber Ihrer Behauptung, das LD_LIBRARY_PATH
Nimmt Vorrang vor dem "gebackenen" Vorrang DT_RPATH
Allerdings - zumindest unter Linux und (ich glaube) Solaris, LD_LIBRARY_PATH
wird erst danach betrachtet DT_RPATH
Die Suche ist gescheitert.
Andere Tipps
Vielleicht können Sie einen Shell -Wrapper verwenden, der die Umgebung für nur dieses Programm verändert?
#!/bin/sh
LD_LIBRARY_PATH="/path/to/your/lib:${LD_LIBRARY_PATH}"
export LD_LIBRARY_PATH
exec /path/to/binary $@
Dies sollte vor der Ausführung den ld_library_path überladen und dann den Wrapper durch EXEC durch die Binärdatei ersetzen.
Würde das helfen?