-
Ano, při inicializaci se připojí. Technicky dynamický linker nepotřebuje rozlišení a přemístění objektů pro sebe, protože je plně vyřešen tak, jak je, ale definuje symboly a musí se o ně postarat při řešení binárního kódu, který „interpretuje“, a tyto symboly jsou aktualizovány. ukázat na jejich implementace v načtených knihovnách. Konkrétně to ovlivňuje
malloc
— linker má vestavěnou minimální verzi s odpovídajícím symbolem, ale ta je po načtení a přemístění nahrazena verzí knihovny C (nebo dokonce vloženou verzí, pokud nějaká existuje), přičemž je třeba dbát na to, aby se tak nestalo se to nestane v okamžiku, kdy by to mohlo přerušit linker.Krvavé podrobnosti jsou v
rtld.c
, vdl_main
funkce.Všimněte si však, že
ld.so
nemá žádné vnější závislosti. Můžete vidět symboly spojené snm -D
; žádný z nich není nedefinovaný. -
Manuálová stránka odkazuje pouze na položky přímo pod
/lib
, tj./lib/ld.so
(dynamický linker libc 5, který podporujea.out
) a/lib*/ld-linux*.so*
(dynamický linker libc 6, který podporuje ELF). Manuálová stránka je velmi specifické ald.so
neníld-2.28.so
.Dynamický linker, který se nachází na velké většině současných systémů, nezahrnuje
a.out
podporu.
file
a ldd
hlásit různé věci pro dynamický linker, protože mají různé definice toho, co tvoří staticky propojenou binární hodnotu. Pro ldd
, je binární soubor staticky propojen, pokud nemá DT_NEEDED
symboly, tj. žádné nedefinované symboly. Pro file
, binární soubor ELF je staticky propojen, pokud nemá PT_DYNAMIC
sekce (toto se změní ve verzi file
následujících 5,37; nyní používá přítomnost PT_INTERP
sekce jako indikátor dynamicky propojeného binárního souboru, který odpovídá komentáři v kódu).
Dynamický linker knihovny GNU C nemá žádné DT_NEEDED
symboly, ale má PT_DYNAMIC
sekce (protože jde technicky o sdílenou knihovnu). Výsledkem je ldd
(což je dynamický linker) označuje, že je staticky propojen, ale file
označuje, že je dynamicky propojen. Nemá PT_INTERP
část, takže příští vydání file
bude také indikovat, že je staticky propojen.
$ ldd /lib64/ld-linux-x86-64.so.2
statically linked
$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
(s file
5.35)
$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
(s aktuálně vyvíjenou verzí file
).