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
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:
- 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.
Poza binariami z ustawionym bitem set-user-ID/set-group-ID,dla
których jest to ignorowane.
- 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ę 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).
- o
- 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.
ZOBACZ TAKŻE¶
ldd(1),
sprof(1),
getauxval(3),
rtld-audit(7),
ldconfig(8),
sln(8)
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) <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ą
3.71 oryginału.