Zakładając, że chcę przetestować, czy biblioteka jest zainstalowana i używana przez program. Mogę użyć, ldconfig -p | grep mylib
aby 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 ldconfig
nie 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.
linux
dynamic-linking
ld
nbubis
źródło
źródło
ldd <binary>
aby sprawdzić, czy wszystkie połączone biblioteki znajdują się na ścieżce. Może jest bardziej elegancki sposób.ldd
służy właśnie temu celowi.LIBRARY_PATH
zmiennej środowiskowej, która jest sprawdzana np. przezgcc
kompilator.LIBRARY_PATH
Zmienna ma również oddzielone dwukropkiem listę katalogów.Odpowiedzi:
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 -N
zindeksuje 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:źródło
ldconfig
nie jest przenośny, ponieważ dotyczy tylko implementacji opartych naa.out
dynamicznym łączniku opartym na SunOS-4.0 z 1987 roku./sbin/ldconfig -N -v $(sed 's/:/ /' <<< $LD_LIBRARY_PATH)
na mój gust nie przesada.ldconfig
w porozumieniu z AT&T, ponieważ buforowanie linkera było zbyt wrażliwe na błędy. Sun później dodałthe tree stooges
:moe
,lari
icrle
jako programy pomocnicze do zarządzania ELF.Globalnie zamień (spację) na
:
LD_LIBRARY_PATHźródło
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:
-Wl,--no-as-needed
zapobiega łączeniu biblioteki przez linker, ponieważ nie są używane żadne symbole z biblioteki.źródło