W CentOS 7.2 zbudowałem aplikację z g++ 4.8.5, która nie może działać, ponieważ nie może znaleźć biblioteki, która nie istnieje w swoim runpath. Jestem prawie pewien, że zadziałało dwa tygodnie temu. Co może to spowodować?

$ ./app
./app: error while loading shared libraries: libhdf5.so.9: cannot open shared object file: No such file or directory

$ ldd ./app | grep libhdf5
    libhdf5.so.9 => not found

$ readelf app -d | grep path
 0x000000000000001d (RUNPATH)            Library runpath: [/opt/ProductName/lib:/opt/ProductName/lib/private]

$ ll /opt/ProductName/lib/libhdf5.so*
lrwxrwxrwx. 1 fotechd fotechd      16 Oct 26 14:38 /opt/ProductName/lib/libhdf5.so -> libhdf5.so.9.0.0
lrwxrwxrwx. 1 fotechd fotechd      16 Oct 26 14:38 /opt/ProductName/lib/libhdf5.so.9 -> libhdf5.so.9.0.0
-rwxr-xr-x. 1 fotechd fotechd 3316074 Oct 26 14:35 /opt/ProductName/lib/libhdf5.so.9.0.0

Ustawienie LD_LIBRARY_PATH naprawia to tymczasowo:

$ LD_LIBRARY_PATH=/opt/ProductName/lib ./app
...
OK
5
Qwertie 13 listopad 2018, 20:40

2 odpowiedzi

Najlepsza odpowiedź

Udało mi się rozwiązać ten problem po mojej stronie. Dla mnie było tak, ponieważ nie znaleziona biblioteka była pośrednią, a runpath faktycznie nie rozwiązuje pośrednich zależności. Naprawiłem to używając rpath zamiast runpath, przekazując dodatkową opcję linkera -Wl,--disable-new-dtags do kompilatora.

Tutaj jest dobre i szczegółowe wyjaśnienie: Jak ustawić RPATH i RUNPATH z GCC/LD?

5
Longfield 14 luty 2019, 12:54

Aby znaleźć udostępnione obiekty, dlopen() przeszukuje następujące elementy, w tej kolejności:

  • ścieżka wyszukiwania biblioteki uruchomieniowej, która została ustawiona przy użyciu opcji -rpath na ld (patrz Dokumentacja narzędzi) podczas linkowania pliku binarnego
  • katalogi określone przez zmienną środowiskową LD_LIBRARY_PATH
  • katalogi określone przez ciąg konfiguracyjny _CS_LIBPATH

Wygląda na to, że dlopen() nie sprawdza RUNPATH.

http://www.qnx.com/developers/docs/6.5.0SP1.update/com.qnx.doc.neutrino_lib_ref/d/dlopen.html

0
Samuel 3 listopad 2020, 09:52