Der Mechanismus, den ich normalerweise verwende, ist eine Kombination aus dem Speichern readelf -V
der .gnu.version
Informationen aus libstdc ++ und einer Nachschlagetabelle, die dem größten GLIBCXX_
extrahierten Wert entspricht.
readelf -sV /usr/lib/libstdc++.so.6 | sed -n 's/.*@@GLIBCXX_//p' | sort -u -V | tail -1
Wenn Ihre Version von sort
zu alt ist, um die -V
Option zu haben (die nach Versionsnummer sortiert ist), können Sie Folgendes verwenden:
tr '.' ' ' | sort -nu -t ' ' -k 1 -k 2 -k 3 -k 4 | tr ' ' '.'
anstelle von sort -u -V
, um nach bis zu 4 Versionsziffern zu sortieren.
Im Allgemeinen sollte die Übereinstimmung mit der ABI-Version gut genug sein.
Wenn Sie jedoch versuchen, das aufzuspüren libstdc++.so.<VERSION>
, können Sie eine kleine Bash verwenden, wie:
file=/usr/lib/libstdc++.so.6
while [ -h $file ]; do file=$(ls -l $file | sed -n 's/.*-> //p'); done
echo ${file#*.so.}
Für mein System ergab sich dies 6.0.10
.
Wenn Sie jedoch versuchen, eine Binärdatei zu erhalten, die auf systemX kompiliert wurde, um auf systemY zu funktionieren, werden Sie mit solchen Dingen nur so weit kommen. In diesen Fällen müssen Sie eine Kopie von libstdc ++. Mit sich führen, die für die Anwendung verwendet wurde, und anschließend ein Skript ausführen, das Folgendes ausführt:
export LD_LIBRARY_PATH=<directory of stashed libstdc++.so>
exec application.bin "$@"
Im Allgemeinen wird das Problem behoben, dass die .so-Datei auf der Box nicht mit der Version aus der Anwendung kompatibel ist. Bei extremeren Unterschieden in der Umgebung füge ich normalerweise nur alle abhängigen Bibliotheken hinzu, bis die Anwendung ordnungsgemäß funktioniert. Dies ist das Linux-Äquivalent zum Umgehen dessen, was für Windows als DLL-Hölle angesehen wird .