Zmiana połączonej biblioteki dla danego pliku wykonywalnego (CentOs 6)

29

Mam plik wykonywalny powiązany w ten sposób:

  $ ldd a.out
        libboost_system-mt.so.1.47.0 => /usr/lib64/libboost_system-mt.so.1.47.0 (0x00007f4881f56000)
        libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f4881cfb000)
        libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f4881965000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f488175d000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4881540000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f4881239000)
.
.

Gdzie są biblioteki libcrypto i libssl, openssl 1.0.0-fips libs. Zamiast tego chcę eksperymentować z bibliotekami 1.0.1, więc wbudowałem je w mój katalog domowy. Czy jest jakiś sposób, aby a.outpołączyć się z moimi nowymi bibliotekami openssl bez większego bólu? Chciałbym uniknąć

  • Konieczność ponownego połączenia a.out(ponieważ narzędzia kompilacji są bardzo skomplikowane)
  • Zmiana jakichkolwiek ustawień globalnych (ponieważ inni deweloperzy pracują na tym komputerze)

Czy można tutaj robić to, na co mam nadzieję?

Fixee
źródło

Odpowiedzi:

22

Możesz tymczasowo zastąpić inną bibliotekę tym konkretnym wykonaniem. W Linuksie zmienna środowiskowa LD_LIBRARY_PATH jest oddzielonym dwukropkami zestawem katalogów, w których biblioteki powinny być najpierw wyszukiwane, przed standardowym zestawem katalogów; jest to przydatne podczas debugowania nowej biblioteki lub korzystania z niestandardowej biblioteki do specjalnych celów. Zmienna środowiskowa LD_PRELOAD zawiera listę bibliotek współdzielonych z funkcjami, które zastępują zestaw standardowy, podobnie jak /etc/ld.so.preload. - Udostępnione biblioteki

Możesz także wywołać moduł ładujący bezpośrednio:

/lib/ld-linux.so.2 --library-path path executable

David Schwartz
źródło
1
LD_LIBRARY_PATH nie zastępuje domyślnej ścieżki wyszukiwania. Ustawiłem, ale ldd wciąż pokazuje mi domyślną ścieżkę systemu, a nie przesłoniętą. Chociaż mogę wymusić ładowanie własnej biblioteki, ustawiając LD_PRELOAD.
Calmarius,
18

Napisz skrypt otoki, który ustawia LD_LIBRARY_PATHzmienną środowiskową. Jest to zawieszka PATHdla bibliotek współdzielonych. Ścieżka wyszukiwania systemu jest zawsze przeszukiwana po katalogach wymienionych w $LD_LIBRARY_PATH. Zobacz podręcznik dynamicznego linkera .

#!/bin/sh
export LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib
exec /path/to/a.out "$@"

Lub, jednorazowo, bezpośrednio w wierszu poleceń:

LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib ./a.out

Alternatywnie, jeśli chcesz zmodyfikować plik binarny, wypróbuj chrpath , który pozwala edytować ścieżkę wyszukiwania biblioteki zapisaną w pliku wykonywalnym.

Gilles „SO- przestań być zły”
źródło
2
+1 dla chrpath. Dokładnie to, czego potrzebowałem.
Raghav RV
Urocza historia, Microsoft jest zbyt głupi, aby spędzić 2 minuty na googlowaniu i radzi wszystkim, aby korzystali z LD_LIBRARY_PATH zamiast jawnego łączenia SQL Servera z openss-1.0.0 lub ponownej kompilacji z wersją openssl.so blogs.msdn.microsoft.com/sql_server_team /…
Evan Carroll