focal (8) ld.so.8.gz

Provided by: manpages-pl_0.7-2_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.