Mechanizm ja zwykle używa się kombinacji readelf -V
, aby zrzucić informacje o .gnu.version
z libstdC++, a następnie tabelę odnośników, która dopasowuje największą wyodrębnioną wartość GLIBCXX_
.
readelf -sV /usr/lib/libstdc++.so.6 | sed -n 's/.*@@GLIBCXX_//p' | sort -u -V | tail -1
jeśli wersja sort
jest zbyt stary, aby mieć możliwość -V
(który sortuje według numeru wersji), a następnie można użyć:
tr '.' ' ' | sort -nu -t ' ' -k 1 -k 2 -k 3 -k 4 | tr ' ' '.'
zamiast sort -u -V
, sortowanie przez maksymalnie 4 cyfry wersji.
Ogólnie rzecz biorąc, dopasowanie wersji ABI powinno być wystarczająco dobre.
Jeśli starasz się wyśledzić libstdc++.so.<VERSION>
, choć można użyć trochę bash jak:
file=/usr/lib/libstdc++.so.6
while [ -h $file ]; do file=$(ls -l $file | sed -n 's/.*-> //p'); done
echo ${file#*.so.}
więc dla mojego systemu Dało 6.0.10
.
Jeśli jednak próbujesz uzyskać plik binarny, który został skompilowany na systemX, aby działał na systemY, to tego typu rzeczy doprowadzą cię tylko do tej pory. W tych przypadkach, niosąc wraz z kopią libstdC++, tak aby był używany dla aplikacji, a następnie o skrypt uruchamiania, który robi an:.
export LD_LIBRARY_PATH=<directory of stashed libstdc++.so>
exec application.bin "[email protected]"
generalnie działa wokół kwestii .so, które znajduje się na box jest niezgodny z wersją z aplikacji. W przypadku bardziej ekstremalnych różnic w środowisku zwykle dodajemy wszystkie biblioteki zależne, dopóki aplikacja nie będzie działać poprawnie. Jest to odpowiednik linuksa, który obejmie to, co dla okien będzie uważane za piekło.
W datestamps są niemal całkowicie bezużyteczny, nie wiem dlaczego przeszkadza im lub dokumentowanie utrzymanie im. Na przykład data GCC 4.6.3 jest późniejsza niż 4.7.0, ale 4.7.0 ma więcej funkcji, więc jaki jest pożytek z poznania daty wydania? –