-
Sì, si collega da solo quando si inizializza. Tecnicamente il linker dinamico non ha bisogno della risoluzione e del riposizionamento dell'oggetto per se stesso, poiché è completamente risolto così com'è, ma definisce i simboli e deve occuparsi di quelli durante la risoluzione del binario che sta "interpretando" e quei simboli vengono aggiornati per indicare le loro implementazioni nelle librerie caricate. In particolare, questo riguarda
malloc
— il linker ha una versione minima incorporata, con il simbolo corrispondente, ma viene sostituita dalla versione della libreria C una volta caricata e riposizionata (o anche da una versione interposta se ce n'è una), con una certa attenzione per garantire che ciò non non accadrà in un punto in cui potrebbe interrompere il linker.I dettagli cruenti sono in
rtld.c
, neldl_main
funzione.Nota comunque che
ld.so
non ha dipendenze esterne. Puoi vedere i simboli coinvolti connm -D
; nessuno di loro è indefinito. -
La manpage si riferisce solo alle voci direttamente sotto
/lib
, vale a dire/lib/ld.so
(il linker dinamico libc 5, che supportaa.out
) e/lib*/ld-linux*.so*
(il linker dinamico libc 6, che supporta ELF). La manpage è molto specifico eld.so
non èld-2.28.so
.Il linker dinamico che si trova nella stragrande maggioranza dei sistemi attuali non include
a.out
supporto.
file
e ldd
riportano cose diverse per il linker dinamico perché hanno definizioni diverse di ciò che costituisce un binario collegato staticamente. Per ldd
, un binario è collegato staticamente se non ha DT_NEEDED
simboli, vale a dire nessun simbolo indefinito. Per file
, un binario ELF è collegato staticamente se non ha un PT_DYNAMIC
sezione (questo cambierà nel rilascio di file
dopo le 5.37; ora utilizza la presenza di un PT_INTERP
come indicatore di un binario collegato dinamicamente, che corrisponde al commento nel codice).
Il linker dinamico della libreria GNU C non ha alcun DT_NEEDED
simboli, ma ha un PT_DYNAMIC
sezione (dal momento che è tecnicamente una libreria condivisa). Di conseguenza, ldd
(che è il linker dinamico) indica che è collegato staticamente, ma file
indica che è collegato dinamicamente. Non ha un PT_INTERP
sezione, quindi la prossima versione di file
indicherà anche che è collegato staticamente.
$ 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
(con 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
(con la versione attualmente in sviluppo di file
).