Fix LiveTraffic CURL_OPENSSL_4 na Steam Linux (X-Plane 12)
This commit is contained in:
commit
73e51f897e
3 files changed
+190
No files matched your search
@@ -0,0 +1,5 @@
|
||||
# Nie wrzucamy binarek .so (zależne od wersji systemu)
|
||||
*.so
|
||||
*.so.*
|
||||
*.xpl
|
||||
*.xpl.bak
|
||||
@@ -0,0 +1,62 @@
|
||||
# LiveTraffic Steam Fix (X-Plane 12, Linux)
|
||||
|
||||
Naprawia problem z ładowaniem wtyczki **LiveTraffic** w wersji X-Plane 12 ze **Steam** na Linuxie.
|
||||
|
||||
## Problem
|
||||
|
||||
Steam Linux Runtime „przypina" (pinuje) własny, stary `libcurl.so.4` (wersja 4.2.0), który eksportuje tylko symbol `CURL_OPENSSL_3`. LiveTraffic jest zbudowany przeciw nowszemu libcurl (`CURL_OPENSSL_4`) i wymaga też `libssl.so.3` / `libcrypto.so.3`.
|
||||
|
||||
Efekt w `Log.txt`:
|
||||
|
||||
```
|
||||
dlerror: .../SteamLinuxRuntime/var/steam-runtime/pinned_libs_64/libcurl.so.4:
|
||||
version `CURL_OPENSSL_4' not found
|
||||
(required by .../LiveTraffic/lin_x64/LiveTraffic.xpl)
|
||||
```
|
||||
|
||||
i wtyczka **nie** jest ładowana (nie pojawia się w menu `Plugins`).
|
||||
|
||||
To samo dotyczy innych wtyczek zbudowanych przeciw nowemu libcurl (np. plugin **REP** dla Cessny — SimCoders).
|
||||
|
||||
## Dlaczego to się dzieje
|
||||
|
||||
Steam Runtime v1 („scout") jest zgodny z Ubuntu 12.04, więc musi używać starego ABI `libcurl`. To potwierdzone przez Valve — nie da się tego obejść opcjami uruchamiania (`STEAM_RUNTIME_USE_LIBCURL_SHIM` ani przełączeniem runtime'u na soldier).
|
||||
|
||||
## Rozwiązanie
|
||||
|
||||
Kopiujemy **systemowy** `libcurl` + wszystkie jego zależności do katalogu wtyczki i ustawiamy `RPATH=$ORIGIN/lib`, dzięki czemu wtyczka ładuje własne, nowe biblioteki niezależnie od Steam Runtime.
|
||||
|
||||
## Użycie
|
||||
|
||||
```bash
|
||||
./fix-livetraffic.sh [/ścieżka/do/X-Plane 12]
|
||||
```
|
||||
|
||||
Domyślnie skrypt zakłada ścieżkę `/mnt/nvme_data/SteamLibrary/steamapps/common/X-Plane 12`. Możesz podać własną jako argument.
|
||||
|
||||
Wymagania:
|
||||
- `patchelf` (`pacman -S patchelf`)
|
||||
- systemowy `libcurl` 4.8+ z `libssl.so.3` (Arch Linux / nowoczesny Linux)
|
||||
|
||||
## Co robi skrypt
|
||||
|
||||
1. Backup `LiveTraffic.xpl` → `LiveTraffic.xpl.bak`.
|
||||
2. Kopiuje `libcurl.so.4` + 21 zależności z `/usr/lib` do `LiveTraffic/lin_x64/lib/`.
|
||||
3. Ustawia `RPATH=$ORIGIN` na wszystkich skopiowanych bibliotekach.
|
||||
4. Ustawia `RPATH=$ORIGIN/lib` na `LiveTraffic.xpl`.
|
||||
|
||||
## Weryfikacja
|
||||
|
||||
Po uruchomieniu X-Plane w `Log.txt` szukaj:
|
||||
|
||||
```
|
||||
Loaded: .../LiveTraffic/lin_x64/LiveTraffic.xpl
|
||||
```
|
||||
|
||||
(zamiast `dlerror`).
|
||||
|
||||
## Uwagi
|
||||
|
||||
- Skrypt jest **idempotentny** — można go uruchomić wielokrotnie (backup robi tylko raz).
|
||||
- Po aktualizacji systemu (nowszy libcurl) uruchom skrypt ponownie, żeby odświeżyć biblioteki.
|
||||
- Nie wrzucamy binarek `.so` do tego repo — są zależne od wersji systemu.
|
||||
Executable
+123
@@ -0,0 +1,123 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# fix-livetraffic.sh — naprawia LiveTraffic na X-Plane 12 (Steam, Linux)
|
||||
#
|
||||
# Problem:
|
||||
# Steam Linux Runtime "przypina" (pinuje) stary libcurl.so.4 (4.2.0), który
|
||||
# eksportuje tylko symbol CURL_OPENSSL_3. LiveTraffic jest zbudowany przeciw
|
||||
# nowemu libcurl (CURL_OPENSSL_4) i wymaga też libssl.so.3 / libcrypto.so.3.
|
||||
# Efekt: w Log.txt pojawia się:
|
||||
# dlerror: .../pinned_libs_64/libcurl.so.4: version `CURL_OPENSSL_4' not found
|
||||
# (required by .../LiveTraffic/lin_x64/LiveTraffic.xpl)
|
||||
# i plugin nie jest ładowany (nie widać go w menu Plugins).
|
||||
#
|
||||
# Rozwiązanie:
|
||||
# Kopiujemy systemowy libcurl + wszystkie jego zależności do katalogu wtyczki
|
||||
# (LiveTraffic/lin_x64/lib) i ustawiamy RPATH=$ORIGIN/lib na pliku .xpl oraz
|
||||
# na każdej skopiowanej bibliotece. Wtedy wtyczka ładuje własne, nowe
|
||||
# biblioteki niezależnie od Steam Runtime.
|
||||
#
|
||||
# Użycie:
|
||||
# ./fix-livetraffic.sh [/ścieżka/do/X-Plane 12]
|
||||
#
|
||||
# Wymagania:
|
||||
# - patchelf (pacman -S patchelf)
|
||||
# - systemowy libcurl 4.8+ z libssl.so.3 (Arch / nowoczesny Linux)
|
||||
#
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Domyślna ścieżka — podmień lub podaj jako argument
|
||||
XP_ROOT="${1:-/mnt/nvme_data/SteamLibrary/steamapps/common/X-Plane 12}"
|
||||
|
||||
XPL_DIR="$XP_ROOT/Resources/plugins/LiveTraffic/lin_x64"
|
||||
LIB_DIR="$XPL_DIR/lib"
|
||||
XPL="$XPL_DIR/LiveTraffic.xpl"
|
||||
|
||||
if [ ! -f "$XPL" ]; then
|
||||
echo "BŁĄD: nie znaleziono $XPL" >&2
|
||||
echo "Podaj ścieżkę do X-Plane 12 jako argument:" >&2
|
||||
echo " $0 /sciezka/do/X-Plane 12" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
command -v patchelf >/dev/null 2>&1 || {
|
||||
echo "BŁĄD: brak patchelf. Zainstaluj: pacman -S patchelf" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
SYSLIBCURL="$(readlink -f /usr/lib/libcurl.so.4 2>/dev/null || echo "")"
|
||||
if [ -z "$SYSLIBCURL" ] || [ ! -f "$SYSLIBCURL" ]; then
|
||||
echo "BŁĄD: nie znaleziono systemowego libcurl.so.4 w /usr/lib" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "== X-Plane: $XP_ROOT"
|
||||
echo "== systemowy libcurl: $SYSLIBCURL"
|
||||
|
||||
# 1. Backup oryginalnego .xpl (raz)
|
||||
if [ ! -f "$XPL.bak" ]; then
|
||||
cp -a "$XPL" "$XPL.bak"
|
||||
echo "== backup: $XPL.bak"
|
||||
fi
|
||||
|
||||
# 2. Katalog na biblioteki
|
||||
mkdir -p "$LIB_DIR"
|
||||
|
||||
# 3. Lista bibliotek do skopiowania (libcurl + pełne zależności, bez glibc)
|
||||
SONAMES=(
|
||||
libcurl.so.4
|
||||
libssl.so.3
|
||||
libcrypto.so.3
|
||||
libnghttp2.so.14
|
||||
libnghttp3.so.9
|
||||
libngtcp2_crypto_ossl.so.0
|
||||
libngtcp2.so.16
|
||||
libidn2.so.0
|
||||
libssh2.so.1
|
||||
libpsl.so.5
|
||||
libzstd.so.1
|
||||
libbrotlidec.so.1
|
||||
libbrotlienc.so.1
|
||||
libbrotlicommon.so.1
|
||||
libunistring.so.5
|
||||
libkrb5.so.3
|
||||
libgssapi_krb5.so.2
|
||||
libk5crypto.so.3
|
||||
libkrb5support.so.0
|
||||
libkeyutils.so.1
|
||||
libcom_err.so.2
|
||||
libz.so.1
|
||||
)
|
||||
|
||||
echo "== kopiuję biblioteki do $LIB_DIR"
|
||||
for soname in "${SONAMES[@]}"; do
|
||||
real="$(readlink -f "/usr/lib/$soname" 2>/dev/null || echo "")"
|
||||
if [ -z "$real" ] || [ ! -f "$real" ]; then
|
||||
echo " POMINIĘTO (brak): $soname"
|
||||
continue
|
||||
fi
|
||||
cp -L "$real" "$LIB_DIR/$(basename "$real")"
|
||||
# realne pliki (libssl.so.3/libcrypto.so.3 to pliki, nie symlinki) — nie rób symlinka do siebie
|
||||
if [ "$(basename "$real")" != "$soname" ]; then
|
||||
ln -sfn "$(basename "$real")" "$LIB_DIR/$soname"
|
||||
fi
|
||||
echo " OK $soname -> $(basename "$real")"
|
||||
done
|
||||
|
||||
# 4. RPATH=$ORIGIN na wszystkich skopiowanych bibliotekach
|
||||
echo "== ustawiam RPATH=\$ORIGIN na bibliotekach"
|
||||
for f in "$LIB_DIR"/*.so.* "$LIB_DIR"/*.so.3 "$LIB_DIR"/*.so.5; do
|
||||
[ -f "$f" ] && patchelf --set-rpath '$ORIGIN' --force-rpath "$f" 2>/dev/null || true
|
||||
done
|
||||
|
||||
# 5. RPATH=$ORIGIN/lib na wtyczce
|
||||
echo "== ustawiam RPATH=\$ORIGIN/lib na LiveTraffic.xpl"
|
||||
patchelf --set-rpath '$ORIGIN/lib' --force-rpath "$XPL"
|
||||
|
||||
echo
|
||||
echo "== GOTOWE. Weryfikacja:"
|
||||
ldd "$XPL" | grep -E "libcurl|libssl|libcrypto" || true
|
||||
echo
|
||||
echo "== Teraz uruchom X-Plane i sprawdź w Log.txt linię:"
|
||||
echo " Loaded: .../LiveTraffic/lin_x64/LiveTraffic.xpl"
|
||||
Reference in new issue
Block a user