Mi sono imbattuto recentemente in un riferimento a proggit e (per ora) non è stato spiegato.
Ho il sospetto che questo potrebbe essere, ma non lo so per certo.
Mi sono imbattuto recentemente in un riferimento a proggit e (per ora) non è stato spiegato.
Ho il sospetto che questo potrebbe essere, ma non lo so per certo.
Risposte:
Se si imposta LD_PRELOADil percorso di un oggetto condiviso, quel file verrà caricato prima di qualsiasi altra libreria (incluso il runtime C libc.so). Quindi per eseguire lscon l' malloc()implementazione speciale , procedere come segue:
$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
LD_PRELOAD. Il motivo è che essendo una variabile di ambiente, è ereditata da processi figlio, che possono avere una directory di lavoro diversa rispetto al processo padre. Pertanto, qualsiasi percorso relativo non riuscirebbe a individuare la libreria da precaricare.
È possibile sovrascrivere i simboli nelle librerie di titoli creando una libreria con gli stessi simboli e specificando la libreria in LD_PRELOAD.
Alcune persone lo usano per specificare le librerie in posizioni non standard, ma LD_LIBRARY_PATHè meglio a tale scopo.
Con LD_PRELOADte puoi dare la precedenza alle biblioteche.
Ad esempio è possibile scrivere una libreria che implementa malloce free. E caricandoli con il LD_PRELOADtuo malloce freeverranno eseguiti anziché quelli standard.
calloc? non rovinerebbe tutto?
malloce gratuito sono specificamente progettati in glibc per consentire questo e lo stock callocriesce a chiamare il tuo importato malloc. Non provarlo con altre funzioni. Non funzionerà così bene.
Come molte persone hanno detto, usando LD_PRELOADper precaricare la libreria. A proposito, puoi CONTROLLARE se l'impostazione è disponibile tramite lddcomando.
Esempio: supponi di dover precaricare il tuo libselinux.so.1.
> ldd /bin/ls
...
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f3927b1d000)
libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f3927914000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f392754f000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f3927311000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f392710c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3927d65000)
libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007f3926f07000)
Quindi, imposta il tuo ambiente di precarico:
export LD_PRELOAD=/home/patric/libselinux.so.1
Controlla di nuovo la tua libreria:
>ldd /bin/ls
...
libselinux.so.1 =>
/home/patric/libselinux.so.1 (0x00007fb9245d8000)
...
LD_PRELOADelenca le librerie condivise con funzioni che sovrascrivono il set standard, proprio come /etc/ld.so.preloadfa. Questi sono implementati dal caricatore /lib/ld-linux.so. Se si desidera sovrascrivere solo alcune funzioni selezionate, è possibile farlo creando un file oggetto e un'impostazione di sostituzione LD_PRELOAD; le funzioni in questo file oggetto sovrascriveranno solo quelle funzioni lasciando gli altri come erano.
Per ulteriori informazioni sulle librerie condivise, visitare http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
Ecco un post dettagliato sul blog sul precaricamento:
è facile esportare mylib.soin env:
$ export LD_PRELOAD=/path/mylib.so
$ ./mybin
disabilitare :
$ export LD_PRELOAD=
unset LD_PRELOAD
quando viene utilizzato LD_PRELOAD, quel file verrà caricato prima di qualsiasi altra
$export LD_PRELOAD=/path/liblibreria da precaricare, anche questo può essere usato anche nei programmi
Utilizzando il LD_PRELOADpercorso, è possibile forzare il caricatore dell'applicazione a caricare l'oggetto condiviso fornito, rispetto al valore predefinito fornito.
Gli sviluppatori lo usano per eseguire il debug delle loro applicazioni fornendo diverse versioni degli oggetti condivisi.
Lo abbiamo usato per hackerare determinate applicazioni, sovrascrivendo le funzioni esistenti usando oggetti condivisi preparati.