Dowiedz się, czy biblioteka jest na ścieżce

15

Zakładając, że chcę przetestować, czy biblioteka jest zainstalowana i używana przez program. Mogę użyć, ldconfig -p | grep mylibaby dowiedzieć się, czy jest on zainstalowany w systemie. ale co, jeśli biblioteka jest znana tylko poprzez ustawienie LD_LIBRARY_PATH?

W takim przypadku program może znaleźć bibliotekę, ale ldconfignie będzie. Jak mogę sprawdzić, czy biblioteka znajduje się w połączonej ścieżce linkera?

Dodam, że szukam rozwiązania, które zadziała, nawet jeśli tak naprawdę nie mam pod ręką programu (np. Program nie jest jeszcze skompilowany), chcę tylko wiedzieć, że istnieje pewna biblioteka w ld„ s ścieżki.

nbubis
źródło
2
Możesz użyć, ldd <binary>aby sprawdzić, czy wszystkie połączone biblioteki znajdują się na ścieżce. Może jest bardziej elegancki sposób.
Thomas
@ Thomas Uważam, że powinieneś udzielić odpowiedzi na swój komentarz. lddsłuży właśnie temu celowi.
lgeorget
1
@Thomas - ale co, jeśli ja program nie jest jeszcze skompilowany, a ta biblioteka jest potrzebna do kompilacji?
nbubis
@Igeorget - patrz moja edycja / komentarz
nbubis
@nbubis: gdy potrzebujesz biblioteki do kompilacji, zwykle musisz użyć LIBRARY_PATHzmiennej środowiskowej, która jest sprawdzana np. przez gcckompilator. LIBRARY_PATHZmienna ma również oddzielone dwukropkiem listę katalogów.
Thomas

Odpowiedzi:

15

ldconfig może wyświetlić listę wszystkich bibliotek, do których ma dostęp. Te biblioteki są również przechowywane w pamięci podręcznej.

/sbin/ldconfig -v -Nzindeksuje wszystkie zwykłe ścieżki bibliotek, wyświetli listę wszystkich dostępnych bibliotek, bez rekonstrukcji pamięci podręcznej (co nie jest możliwe, jeśli nie jesteś użytkownikiem root). NIE bierze pod uwagę bibliotek w LD_LIBRARY_PATH (w przeciwieństwie do tego, co powiedział ten post przed edycją), ale możesz przekazać dodatkowe biblioteki do wiersza poleceń, używając poniższego wiersza:

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)
lgeorget
źródło
ldconfig to narzędzie z lat 80., które zostało porzucone w latach 90. Z tego powodu ldconfignie jest przenośny, ponieważ dotyczy tylko implementacji opartych na a.outdynamicznym łączniku opartym na SunOS-4.0 z 1987 roku.
schily
W jaki sposób pomaga to w wyświetlaniu bibliotek lib, które są tylko na LD_LIBRARY_PATH? Wydaje mi się, że mógłbym napisać skrypt, który to przeanalizuje, a następnie przeczytać to za pomocą ldconfig, ale wygląda to trochę jak zabójstwo.
nbubis
1
@ nbubis zawsze możesz przekazać biblioteki w LD_LIBRARY_PATH do ldconfig. Jak /sbin/ldconfig -N -v $(sed 's/:/ /' <<< $LD_LIBRARY_PATH)na mój gust nie przesada.
lgeorget
@schily Naprawdę? O ile mi wiadomo, działa całkiem dobrze z bibliotekami ELF. I nadal jest używany, ld.so polega na pamięci podręcznej zbudowanej przez ldconfig.
lgeorget
Ludzie z Linuksa zhakowali stary kod źródłowy Sun linkera, aby obsłużyć ELF. Nowa implementacja ELF firmy Sun została usunięta ldconfigw porozumieniu z AT&T, ponieważ buforowanie linkera było zbyt wrażliwe na błędy. Sun później dodał the tree stooges: moe, larii crlejako programy pomocnicze do zarządzania ELF.
schily
2

Globalnie zamień (spację) na :LD_LIBRARY_PATH

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)
fizwit
źródło
2

Możesz skompilować prosty program testowy za pomocą gcc i połączyć swoją bibliotekę. Następnie możesz sprawdzić używane biblioteki za pomocą ldd. Używam czegoś takiego:

echo "int main(){}" | gcc -x c++ -Wl,--no-as-needed -lmylib - && ldd a.out | grep mylib

-Wl,--no-as-needed zapobiega łączeniu biblioteki przez linker, ponieważ nie są używane żadne symbole z biblioteki.

guini
źródło