GNU/Linux >> Linux Esercitazione >  >> Linux

In che modo il linker/caricatore dinamico stesso può essere collegato dinamicamente come riportato da `file`?

  1. 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 , nel dl_main funzione.

    Nota comunque che ld.so non ha dipendenze esterne. Puoi vedere i simboli coinvolti con nm -D; nessuno di loro è indefinito.

  2. La manpage si riferisce solo alle voci direttamente sotto /lib , vale a dire /lib/ld.so (il linker dinamico libc 5, che supporta a.out ) e /lib*/ld-linux*.so* (il linker dinamico libc 6, che supporta ELF). La manpage è molto specifico e ld.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 ).


Linux
  1. A cosa si riferisce l'interprete segnalato da `file`?

  2. Come posso trovare la versione di Fedora che uso?

  3. Come posso richiamare l'argomento del precedente comando bash?

  4. Come posso installare l'ultimo Anaconda con wget

  5. Come posso conoscere il percorso assoluto di un processo in esecuzione?

Come installare il caricatore IonCube su Ubuntu Linux

Come posso vedere la dimensione dei file e delle directory in Linux?

Come posso anteporre una stringa all'inizio di ogni riga in un file?

Come posso ottenere informazioni sul contenitore Docker Linux dall'interno del contenitore stesso?

Come posso nascondere la barra degli strumenti in Emacs in modo persistente?

Come posso monitorare la lunghezza della coda di accettazione?