Provided by: manpages-pl_0.7-1_all bug

NAZWA

       ld.so, ld-linux.so* - dynamiczny konsolidator/ładowacz

SKŁADNIA

       Konsolidator   dynamiczny   może   być  uruchomiony  albo  pośrednio  przez  uruchomienie  jakiegokolwiek
       skonsolidowanego dynamicznie programu lub obiektu dzielonego (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ą obiekty dzielone (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  obiektów dzielonych, 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  obiektu
       dzielonego  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  obiekt  dzielony
       jest ładowany, używając tej nazwy ścieżki.

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

       o  (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.

       o  Przy  użyciu  zmiennej  środowiskowej  LD_LIBRARY_PATH,  chyba  że plik wykonywalny jest uruchomiony w
          trybie bezpiecznego wykonania; (zob. niżej), gdy jest ignorowana.

       o  (Tylko ELF) Używając katalogów podanych w sekcji atrybutów dynamicznych DT_RUNPATH binarki, jeśli taka
          sekcja istnieje.

       o  Z pliku bufora  /etc/ld.so.cache,  zawierającego  skompilowaną  listę obiektów  dzielonych  poprzednio
          znalezionych  w  ścieżce  obiektów  dzielonych. Jeśli jednakże program binarny został skonsolidowany z
          opcją linkera  -z nodeflib, to pomijane są obiekty dzielone z domyślnych ścieżek obiektów  dzielonych.
          Preferowane  są  obiekty  dzielone zainstalowane w katalogach zgodnych z właściwościami sprzętu (patrz
          niżej).

       o  W domyślnej ścieżce /lib a potem w /usr/lib (na niektórych architekturach 64-bitowych domyślną ścieżką
          64-bitowych obiektów dzielonych jest /lib64, a  potem  /usr/lib64).  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 program lub obiekt dzielony. 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 obiekty 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 obiekty 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ć.

       --inhibit-cache
              Nie używa /etc/ld.so.cache.

       --library-path ścieżka
              Używa ścieżki 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  podczas
              działania w trybie bezpiecznego wykonania (zob. niżej)

       --audit lista
              Używa obiektów wymienionych w liście jako audytorów.

ŚRODOWISKO

       Różne zmienne środowiska wpływają na działanie dynamicznego konsolidatora

   Tryb bezpiecznego wykonania
       Ze   względów   bezpieczeństwa,   działania   niektórych  zmiennych  środowiskowych  jest  anulowane  lub
       modyfikowane, jeśli dynamiczny konsolidator określi, że plik binarny powinien  być uruchomiony  w  trybie
       bezpiecznego  wykonania.  To  określenie  dokonywane  jest na podstawie sprawdzenia, czy wpis AT_SECURE w
       dodatkowym wektorze (zob. getauxval(3)) ma niezerową wartość. Wpis ten  może  mieć  niezerową  wartość  z
       różnych powodów, m.in.:

       *  Rzeczywisty  i  efektywny  identyfikator  użytkownika  procesu  różnią się lub rzeczywisty i efektywny
          identyfikator grupy różnią się. Zwykle ma to miejsce jako rezultat wykonywania programu z  set-user-ID
          lub set-group-ID.

       *  Proces użytkownika z identyfikatorem niebędącym ID roota wykonuje plik binarny z nadanymi przywilejami
          permitted lub effective.

       *  Niezerowa wartość mogła być ustawiona przez linuksowy  moduł bezpieczeństwa - Linux Security Module.

   Zmienne środowiskowe
       Wśród ważniejszych zmiennych środowiskowych są następujące:

       LD_ASSUME_KERNEL (glibc od wersji 2.2.3)
              Każdy  obiekt  dzielony  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 obiekty 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 obiektów 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 obiektu dzielonego (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  obiektu,  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_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
              Lista   katalogów,   w   których   szukać  bibliotek  ELF  podczas  wykonywania.  Składniki  listy
              mogą być oddzielone dwukropkiem lub średnikiem. Podobne do zmiennej środowiskowej PATH. Ta zmienna
              jest ignorowana w trybie bezpiecznego wykonania.

       LD_PRELOAD
              Lista dodatkowych, podanych przez użytkownika obiektów  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  obiektach  dzielonych.  Może  być  używane  do
              wybiórczego  nadpisywania  funkcji  z innych obiektów dzielonych. Obiekty są wyszukiwane zgodnie z
              regułami podanymi w rozdziale OPIS. W trybie bezpiecznego wykonania, załadowane  wstępnie  ścieżki
              zawierające  ukośniki są ignorowane, a obiekty dzielone 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 dowolną wartość) powoduje, że program wypisze  swoje
              dynamiczne zależności, 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). Obiektów tych można użyć do audytu operacji konsolidatora dynamicznego.
              LD_AUDIT jest ignorowane w trybie bezpiecznego wykonania.

              Konsolidator dynamiczny powiadomi obiekty dzielone audytu w tak zwanych punktach sprawdzeń  audytu
              \m  na  przykład  ładowanie nowego dzielonego obiektu, rozwiązanie symbolu lub wywołanie symbolu z
              innego obiektu dzielonego \m przez wywołanie odpowiedniej funkcji  obiektu  dzielonego.  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) Jeśli ta zmienna środowiskowa jest ustawiona na niepusty łańcuch, to  nie
              zachodzi  aktualizacja  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  w trybie bezpiecznego wykonania, chyba że istnieje plik
              /etc/suid-debug (jest zawartość jest nieistotna).

       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 ignorowane w trybie bezpiecznego wykonania.

       LD_DYNAMIC_WEAK
              (glibc od wersji 2.1.91) Jeśli ta zmienna środowiskowa jest zdefiniowana (z dowolną wartością), to
              pozwala na nadpisywanie słabych (ang. weak) symboli (przywracając poprzednie zachowanie glibc). Od
              wersji 2.3.4 biblioteki glibc LD_DYNAMIC_WEAK jest ignorowana w trybie bezpiecznego wykonania.

       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). Od wersji 2.4 biblioteki glibc LD_ORIGIN_PATH jest ignorowana w trybie  bezpiecznego
              wykonania.

       LD_POINTER_GUARD
              (glibc  od  wersji 2.4 do 2.22) 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źniki  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 sposób pseudolosowy zmieniane, aby
              utrudnić hakerowi przejęcie tych wskaźników i przeprowadzenie ataków typu przepełnienie bufora lub
              stosu. Od glibc 2.23 LD_POINTER_GUARD nie można już użyć do wyłączenia ochrony  wskaźników,  która
              jest teraz zawsze aktywna.

       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  w  trybie  bezpiecznego  wykonania;  wówczas  zawsze
              używany jest /var/profile.

       LD_SHOW_AUXV
              (glibc  od  wersji  2.1)  Jeśli  ta  zmienna środowiskowa jest zdefiniowana (z dowolną wartością),
              wyświetla tablicę pomocniczą przekazaną przez jądro. Od wersji 2.3.5 biblioteki glibc LD_SHOW_AUXV
              jest ignorowana w trybie bezpiecznego wykonania.

       LD_TRACE_PRELINKING
              (glibc od wersji 2.4) Jeśli ta zmienna środowiskowa jest zdefiniowana (z dowolną wartością) śledzi
              prekonsolidację obiektu, którego nazwa jest przypisana do tej zmiennej środowiskowej (ldd(1) służy
              do  pozyskania  listy  obiektów,  które  mogą być śledzone).  Jeśli  nazwa  obiektu  nie  zostanie
              rozpoznana, to śledzona jest cała aktywność prekonsolidacji.

       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  obiektów  dzielonych,  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 zdefiniowana z wartością 1, to ani programy wykonywalne, ani  PIE  nie
              będą uwzględniały adresów bazowych. Zmienna ta jest ignorowana w trybie bezpiecznego wykonania.

       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.

       LD_PREFER_MAP_32BIT_EXEC
              (tylko x86-64)(glibc w wersji od 2.23) Zgodnie z przewodnikiem optymalizacji oprogramowania  Intel
              Silvermont,  dla  aplikacji  64-bitowych wydajność przewidywania rozgałęzień może być zmniejszona,
              gdy cel gałęzi jest oddalony o ponad  4GB.  Jeśli  ta  zmienna  środowiskowa  jest  ustawiona  (na
              dowolną wartość),  to  ld.so  spróbuje  najpierw  przypisać  flagi  wykonywalności za pomocą flagi
              MAP_32BIT mmap(2), a jeśli się to nie powiedzie — bez tej flagi. Przy okazji: MAP_32BIT  przypisze
              niższe  2GB  (nie 4GB) przestrzeni adresowej. Ponieważ MAP_32BIT redukuje zakres adresowy dostępny
              dla losowego rozmieszczania obszarów pamięci (ang. ASLR - adress space  layout  randomization),  w
              trybie bezpiecznego wykonania LD_PREFER_MAP_32BIT_EXEC jest zawsze wyłączona.

       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ć obiektów dzielonych oraz
              uporządkowaną listę kandydujących obiektów dzielonych.
       /etc/ld.so.preload
              Plik zawierający oddzieloną spacjami listę obiektów dzielonych  ELF,  które  mają  być  załadowane
              przed programem.
       lib*.so*
              obiekty 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.

   Możliwości sprzętowe
       Niektóre obiekty dzielone są kompilowane z użyciem specyficznych dla danego sprzętu instrukcji, które nie
       muszą istnieć na każdym CPU. Takie obiektypowinny 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ę  danego  obiektu  dzielonego.
       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

ZOBACZ TAKŻE

       ld(1), ldd(1), pldd(1), sprof(1), dlopen(3), getauxval(3), capabilities(7),  rtld-audit(7),  ldconfig(8),
       sln(8)

O STRONIE

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

TŁUMACZENIE

       Autorami   polskiego   tłumaczenia   niniejszej   strony   podręcznika   man   są:  Przemek  Borys  (PTM)
       <pborys@dione.ids.pl>, Grzegorz Goławski (PTM) <grzegol@pld.org.pl>, Robert Luberda <robert@debian.org> i
       Michał Kułach <michal.kulach@gmail.com>.

       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ą  4.05 oryginału.

GNU                                                2015-12-28                                           LD.SO(8)