ld.so(8) dynamiczny konsolidator/ładowacz

Other Alias

ld-linux.so*

SKŁADNIA

Konsolidator dynamiczny może być uruchomiony albo pośrednio przez uruchomienie jakiegokolwiek skonsolidowanego dynamicznie programu lub biblioteki (w tym przypadku żadna opcja linii poleceń nie będzie przekazana do konsolidatora dynamicznego i w przypadku ELF-a uruchomiony zostanie konsolidator dynamiczny przechowywany w sekcji .interp programu), albo bezpośrednio przez uruchomienie:

/lib/ld-linux.so.* [OPCJE] [PROGRAM [ARGUMENTY]]

OPIS

Programy ld.so i ld-linux.so* wyszukują i uruchamiają biblioteki dzielone wymagane przez program, przygotowują program do uruchomienia, a w końcu go uruchamiają.

Binarki linuksowe wymagają konsolidacji dynamicznej (czyli konsolidacji podczas uruchamiania), chyba że podczas kompilacji programowi ld(1) przekazano opcję -static.

Program ld.so obsługuje binarki w używanym dawno temu formacie a.out; ld-linux.so* obsługuje format ELF (/lib/ld-linux.so.1 dla libc5, /lib/ld-linux.so.2 dla glibc2), który jest używany przez wszystkich już od ładnych paru lat. Poza tym oba programy zachowują się tak samo i używają tych samych plików pomocniczych i programów: ldd(1), ldconfig(8) oraz /etc/ld.so.conf.

Podczas rozwiązywania zależności bibliotek, konsolidator dynamiczny najpierw przegląda każdy łańcuch znaków zależności w poszukiwaniu znaku ukośnika (może wystąpić, jeśli podczas linkowania biblioteki podano nazwę ścieżki zawierającą ukośniki). Jeśli taki znak zostanie znaleziony, to łańcuch znaków zależności jest interpretowany jako nazwa (względnej lub bezwzględnej) ścieżki i biblioteka jest ładowana, używając tej nazwy ścieżki.

Jeśli zależność od biblioteki nie zawiera znaku ukośnika, to potrzebne biblioteki dzielone są szukane w następującej kolejności:

  • (Tylko ELF). Używa katalogów podanych w sekcji atrybutów dynamicznych DT_RPATH binarki, jeśli jest obecna i nie istnieje atrybut DT_RUNPATH. Użycie DT_RPATH jest przestarzałe.
  • Przy użyciu zmiennej środowiskowej LD_LIBRARY_PATH. Poza binariami z ustawionym bitem set-user-ID/set-group-ID,dla których jest to ignorowane.
  • (Tylko ELF) Używając katalogów podanych w sekcji atrybutów dynamicznych DT_RUNPATH binarki, jeśli taka sekcja istnieje.
  • Z pliku bufora /etc/ld.so.cache, zawierającego skompilowaną listę bibliotek poprzednio znalezionych w ścieżce bibliotek. Jeśli jednakże program binarny został skonsolidowany z opcją linkera -z nodeflib, to pomijane są biblioteki z domyślnych ścieżek bibliotek. Preferowane są biblioteki zainstalowane w katalogach zgodnych z właściwościami sprzętu (patrz niżej).
  • W domyślnej ścieżce /lib a potem w /usr/lib. Ten krok jest pomijany, jeśli program binarny został skonsolidowany z opcją -z nodeflib konsolidatora.

Rozwijanie zmiennych w rpath

ld.so rozumie pewne łańcuchy znaków w specyfikacji rpath (DT_RPATH lub DT_RUNPATH); łańcuch ty są zamieniane następująco:

$ORIGIN (lub równoważnie ${ORIGIN})
Rozwija się do katalogu zawierającego plik wykonywalny aplikacji. Tak więc aplikacja znajdująca się w jakimśkatalogu/app może zostać skompilowana z


    gcc -Wl,-rpath,'$ORIGIN/../lib'

tak żeby przypisane jej biblioteki dzielone mogły być umieszczone w jakimśkatalogu/lib, niezależnie od tego, gdzie jakiśkatalog jest umieszczony w hierarchii katalogów. Umożliwia to tworzenie aplikacji, które nie muszą być instalowane w specjalnych katalogów, ale mogą po prostu być rozpakowane w dowolnym katalogu i wciąż będą mogły znaleźć swoje biblioteki dzielone.

$LIB (lub równoważnie ${LIB})
Rozwija się do lib lub lib64 w zależności od architektury (np. na x86-64 rozwija się lib64, a na x86-32 rozwija się do lib).
$PLATFORM (lub równoważnie ${PLATFORM})
Rozwija się do łańcucha znaków odpowiadającemu typowi procesora systemu (np. "x86_64"). Na niektórych architekturach jądro Linuksa nie przekazuje konsolidatorowi dynamicznemu oznaczenia platformy. Wartość tego łańcucha znaków jest pobierana z wartości AT_PLATFORM pomocniczego wektora (patrz getauxval(3)).

OPCJE

--list
Wyświetla wszystkie zależności wraz ze sposobem ich rozwiązania.
--verify
Sprawdza, że program jest konsolidowany dynamicznie i że ten konsolidator dynamiczny może go obsłużyć.
--library-path PATH
Używa PATH zamiast ustawienia zmiennej środowiska LD_LIBRARY_PATH (patrz niżej).
--inhibit-rpath LISTA
Ignoruje informacje RPATH i RUNPATH w nazwach obiektów w LIŚCIE. Opcja jest ignorowana, jeśli ld.so ma ustawiony bit set-user-ID lub set-group-ID.
--audit LISTA
Używa obiektów wymienionych w LIŚCIE jako audytorów.

WŁAŚCIWOŚCI SPRZĘTOWE

Niektóre biblioteki są kompilowane z użyciem specyficznych dla danego sprzętu instrukcji, które nie muszą istnieć na każdym CPU. Takie biblioteki powinny być instalowane w katalogach, których nazwy określają wymagane właściwości sprzętu, na przykład /usr/lib/sse2/. Konsolidator dynamiczny porównuje nazwy takich katalogów ze sprzętem maszyny i wybiera najbardziej odpowiednią wersję danej biblioteki. Katalogi właściwości sprzętu mogą tworzyć kaskady, dopuszczając kombinacje cech CPU. Lista nazw wspieranych właściwości sprzętowych zależy od CPU. Obecnie rozpoznawane są następujące nazwy:
Alpha
ev4, ev5, ev56, ev6, ev67
MIPS
loongson2e, loongson2f, octeon, octeon2
PowerPC
4xxmac, altivec, arch_2_05, arch_2_06, booke, cellbe, dfp, efpdouble, efpsingle, fpu, ic_snoop, mmu, notb, pa6t, power4, power5, power5+, power6x, ppc32, ppc601, ppc64, smt, spe, ucache, vsx
SPARC
flush, muldiv, stbar, swap, ultra3, v9, v9v, v9v2
s390
dfp, eimm, esan3, etf3enh, g5, highgprs, hpage, ldisp, msa, stfle, z900, z990, z9-109, z10, zarch
x86 (tylko 32-bitowe)
acpi, apic, clflush, cmov, cx8, dts, fxsr, ht, i386, i486, i586, i686, mca, mmx, mtrr, pat, pbe, pge, pn, pse36, sep, ss, sse, sse2, tm

ŚRODOWISKO

Wśród ważniejszych zmiennych środowiskowych są następujące:
LD_ASSUME_KERNEL
(glibc od wersji 2.2.3). Każda biblioteka dzielona może informować konsolidator dynamiczny o wymaganej minimalnej wersji ABI jądra (To wymaganie jest zakodowane w sekcji "note" ELF-a; sekcja ta jest widoczna w readelf -n jako sekcja oznaczona NT_GNU_ABI_TAG). Podczas działania konsolidator dynamiczny określa wersję ABI uruchomionego jądra i odrzuca biblioteki dzielone, które wymagają minimalnej wersji ABI większej niż wersja ABI uruchomionego jądra.

LD_ASSUME_KERNEL może zostać użyta do spowodowania, że konsolidator dynamiczny założy, że jest uruchomiony na systemie z inną wersją ABI jądra. Na przykład następująca linia poleceń powoduje, że konsolidator dynamiczny podczas ładowania bibliotek dzielonych wymaganych przez mójprog zakłada, że działa w systemie Linux 2.2.5

$ LD_ASSUME_KERNEL=2.2.5 ./mójprog

W systemach, które dostarczają wielu wersji biblioteki dzielonej (w różnych katalogach w ścieżce wyszukiwania) o różnych minimalnych wymaganiach wersji ABI jądra, LD_ASSUME_KERNEL może zostać użyte do wybrania tej wersji biblioteki, która zostanie użyta (w zależności od porządku przeszukiwania katalogów). Historycznie najczęstszym użyciem LD_ASSUME_KERNEL było ręczne wybieranie starszej implementacji POSIX-owych wątków LinuxThreads w systemach, które miały zainstalowane zarówno LinuxThreads, jak i NPTL (który był domyślną wersją na takich systemach); patrz pthreads(7).

LD_BIND_NOT
(glibc od wersji 2.2) Podczas rozwijania symbolu nie aktualizuje Global Offset Table (GOT) i Procedure Linkage Table (PLT).
LD_BIND_NOW
(libc5; glibc od wersji 2.1.1) Gdy zmienna ta jest obecna, sprawia, że dynamiczny konsolidator rozwiąże wszystkie symbole podczas startu programu, a nie wtedy gdy będzie do nich pierwsze odniesienie. Jest to użyteczne podczas używania debuggera.
LD_LIBRARY_PATH
Oddzielona dwukropkami lista katalogów, w których szukać bibliotek ELF podczas wykonywania. Podobne do zmiennej środowiskowej PATH. Ignorowane w przypadku programów z ustawionym bitem set-user-ID lub set-group-ID.
LD_PRELOAD
Lista dodatkowych, podanych przez użytkownika bibliotek dzielonych ELF, którą należy załadować przed wszystkimi innymi. Elementy listy mogą być oddzielone od siebie spacjami lub dwukropkami. Umożliwia to wybiórczą zamianę funkcji w innych bibliotekach dzielonych. Może być używane do wybiórczego nadpisywania funkcji z innych bibliotek dzielonych. Biblioteki są wyszukiwane zgodnie z regułami podanymi w rozdziale OPIS.Dla plików binarnych ELF z ustawionym bitem set-user-ID/set-group-ID, nazwy ścieżek zawierając ukośniki są ignorowane, a biblioteki ze standardowej ścieżki katalogów ładowane będą tylko wtedy, gdy mają także ustawiony bit set-user-ID.
LD_TRACE_LOADED_OBJECTS
(tylko ELF) Gdy zmienna ta jest ustawiona na niepusty łańcuch znaków, to powoduje, że program wypisze swoje zależności od bibliotek dynamicznych, tak jakby był uruchomiany przez ldd(1), a nie normalnie.

Jest także wiele bardziej lub mniej mętnych zmiennych, wiele przestarzałych lub przeznaczonych do użytku wewnętrznego.

LD_AOUT_LIBRARY_PATH
(libc5) Wersja LD_LIBRARY_PATH tylko dla binariów a.out. Starsze wersje ld-linux.so.1 wspierały także LD_ELF_LIBRARY_PATH.
LD_AOUT_PRELOAD
(libc5) Wersja LD_PRELOAD tylko dla binariów a.out. Starsze wersje ld-linux.so.1 wspierały także LD_ELF_PRELOAD.
LD_AUDIT
(glibc od wersji 2.4). Rozdzielona dwukropkami lista określonych przez użytkownika dzielonych obiektów ELF do załadowania przez wszystkimi innymi obiektami w oddzielnej przestrzeni nazw konsolidatora (to jest w przestrzeni nazw, która nie wpływa na przyporządkowania symboli, które odbywa się w procesie). Bibliotek tych można użyć do audytu operacji konsolidatora dynamicznego. LD_AUDIT jest ignorowane dla binarek z ustawionym bitem set-user-ID/set-group-ID.

Konsolidator dynamiczny powiadomi biblioteki audytu w tak zwanych punktach sprawdzeń audytu \m na przykład ładowanie nowej biblioteki, rozwiązanie symbolu lub wywołanie symbolu z innego obiektu dzielonego \m przez wywołanie odpowiedniej funkcji biblioteki audytu. Szczegóły można znaleźć w rtld-audit(7). Interfejs audytu jest w dużej mierze zgodny z tym udostępnianym przez Solarisa, opisanym w jego Przewodniku po konsolidatorze i bibliotekach w rozdziale Interfejs audytu konsolidatora.

LD_BIND_NOT
(glibc od wersji 2.1.95) Nie aktualizuje GOT (global offset table) ani PLT (procedure linkage table) po rozwinięciu symbolu.
LD_DEBUG
(glibc od wersji 2.1) Wypisuje rozwlekłe informacje debugowania konsolidatora dynamicznego. Jeśli ustawione na all wypisuje wszystkie dostępne informacje debugowania, jeśli ustawione na help wyświetla listę kategorii, które można podać jako wartość tej zmiennej środowiskowej. Od glibc wersji 2.3.4 LD_DEBUG jest ignorowana dla binariów set-user-ID/set-group-ID.
LD_DEBUG_OUTPUT
(glibc od wersji 2.1) Plik, do którego będzie zapisane wyjście LD_DEBUG. Domyślnie jest to standardowe wyjście błędów. LD_DEBUG_OUTPUT jest ignorowana dla binariów set-user-ID/set-group-ID.
LD_DYNAMIC_WEAK
(glibc od wersji 2.1.91) Pozwala na nadpisywanie słabych (ang. weak) symboli (przywracając poprzednie zachowanie glibc). Ze względów bezpieczeństwa od wersji 2.3.4 biblioteki glibc LD_DYNAMIC_WEAK jest ignorowane dla programów z ustawionym bitem set-user-ID/set-group-ID.
LD_HWCAP_MASK
(glibc od wersji 2.1) Maska właściwości sprzętowych.
LD_KEEPDIR
(tylko a.out)(libc5) Nie ignoruju katalogu w nazwach ładowanych bibliotek a.out. Używanie tej opcji nie jest zalecane.
LD_NOWARN
(tylko a.out)(libc5) Powstrzymuje ostrzeżenia o bibliotekach a.out o niekompatybilnych numerach minorowych wersji.
LD_ORIGIN_PATH
(glibc od wersji 2.1) Ścieżka, w której znaleziono program binarny (dla programów bez bitu set-user-ID). Ze względów bezpieczeństwa od wersji 2.4 biblioteki glibc LD_ORIGIN_PATH jest ignorowane dla binariów set-user-ID/set-group-ID.
LD_POINTER_GUARD
(glibc od wersji 2.4) Ustawione na 0 powoduje wyłączenie ochrony wskaźników. Jakakolwiek inna wartość włącza ochronę wskaźników, co jest także zachowaniem domyślnym. Ochrona wskaźników jest mechanizmem bezpieczeństwa, w którym niektóre wskaźnika do kodu przechowywanego w zapisywalnej pamięci programu (adresy powrotu zwrócone przez setjmp(3) lub wskaźniki do funkcji używane przez różne funkcje wewnętrzne biblioteki glibc) są w pseudolosowy zmieniane, aby utrudnić hakerowi przejęcie tych wskaźników i przeprowadzenie ataków typu przepełnienie bufora lub stosu.
LD_PROFILE
(glibc od wersji 2.1) Nazwa (pojedynczego) obiektu dzielonego przeznaczonego do profilowania, podane albo jako nazwa ścieżki, albo nazwa pliku so. Wyjście profilowania jest dopisywane do pliku o nazwie "$LD_PROFILE_OUTPUT/$LD_PROFILE.profile".
LD_PROFILE_OUTPUT
(glibc od wersji 2.1) Katalog, w którym powinno być zapisane wyjście LD_PROFILE. Jeśli ta zmienna nie jest zdefiniowana lub jeśli wartość tej zmiennej jest pusta, to domyślnym katalogiem jest /var/tmp. LD_PROFILE_OUTPUT jest ignorowane dla programów set-user-ID i set-group-ID, które zawsze używają /var/profile.
LD_SHOW_AUXV
(glibc od wersji 2.1) Wyświetla tablicę pomocniczą przekazaną przez jądro. Z powodów bezpieczeństwa od wersji 2.3.5 biblioteki glibc LD_SHOW_AUXV jest ignorowana dla binariów set-user-ID/set-group-ID.
LD_USE_LOAD_BIAS
Domyślnie (czyli jeśli ta zmienna nie jest zdefiniowana) programy wykonywalne i prekonsolidowane obiekty dzielone będą uwzględniały adresy bazowe bibliotek, od których zależą, a (nieprekonsolidowane) programy wykonywalne niezależne od pozycji (position-independent executable, PIE) i inne obiekty dzielone nie będą ich uwzględniały. Jeśli LD_USE_LOAD_BIAS jest zdefiniowana z jakąś wartością, to zarówno programy wykonywalne, jak i PIE, będą uwzględniały adresy bazowe. Jeśli LD_USE_LOAD_BIAS jest zdefiniowane i ma wartość 0, to ani programy wykonywalne, ani PIE nie będą uwzględniały adresów bazowych. Zmienna ta jest ignorowana przez programy set-user-ID i set-group-ID.
LD_VERBOSE
(glibc od wersji 2.1). Jeśli ustawione na niepusty łańcuch znaków i jeśli została ustawiona zmienna środowiskowa LD_TRACE_LOADED_OBJECTS, to wypisuje informacje o wersjonowaniu symboli programu.
LD_WARN
(tylko ELF)(glibc od wersji 2.1.3) Jeśli ustawione na niepusty łańcuch znaków, to włącza ostrzeganie o nierozwijalnych symbolach.
LDD_ARGV0
(libc5) argv[0] do użycia przez ldd(1), jeśli żadne argumenty nie są obecne.

PLIKI

/lib/ld.so
Dynamiczny konsolidator/ładowacz a.out
/lib/ld-linux.so.{1,2}
Dynamiczny konsolidator/ładowacz ELF
/etc/ld.so.cache
Plik zawierający skompilowaną listę katalogów, w których należy szukać bibliotek oraz uporządkowaną listę bibliotek kandydujących.
/etc/ld.so.preload
Plik zawierający oddzieloną spacjami listę bibliotek dzielonych ELF, które mają być załadowane przed programem.
lib*.so*
Biblioteki dzielone

UWAGI

Możliwości ld.so dostępne są tylko dla programów binarnych, skompilowanych przy użyciu libc w wersji 4.4.3 lub wyższej. Funkcjonalności ELF-a są dostępne od Linuksa 1.1.52 i libc5.

O STRONIE

Angielska wersja tej strony pochodzi z wydania 3.71 projektu Linux man-pages. Opis projektu, informacje dotyczące zgłaszania błędów, oraz najnowszą wersję oryginału można znaleźć pod adresem http://www.kernel.org/doc/man-pages/.

TŁUMACZENIE

Autorami polskiego tłumaczenia niniejszej strony podręcznika man są: Przemek Borys (PTM) <[email protected]>, Grzegorz Goławski (PTM) <[email protected]>, Robert Luberda <[email protected]> i Michał Kułach <[email protected]>.

Polskie tłumaczenie jest częścią projektu manpages-pl; uwagi, pomoc, zgłaszanie błędów na stronie http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją 3.71 oryginału.