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_PRELOAD
il percorso di un oggetto condiviso, quel file verrà caricato prima di qualsiasi altra libreria (incluso il runtime C libc.so
). Quindi per eseguire ls
con 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_PRELOAD
te puoi dare la precedenza alle biblioteche.
Ad esempio è possibile scrivere una libreria che implementa malloc
e free
. E caricandoli con il LD_PRELOAD
tuo malloc
e free
verranno eseguiti anziché quelli standard.
calloc
? non rovinerebbe tutto?
malloc
e gratuito sono specificamente progettati in glibc per consentire questo e lo stock calloc
riesce a chiamare il tuo importato malloc
. Non provarlo con altre funzioni. Non funzionerà così bene.
Come molte persone hanno detto, usando LD_PRELOAD
per precaricare la libreria. A proposito, puoi CONTROLLARE se l'impostazione è disponibile tramite ldd
comando.
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_PRELOAD
elenca le librerie condivise con funzioni che sovrascrivono il set standard, proprio come /etc/ld.so.preload
fa. 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.so
in 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/lib
libreria da precaricare, anche questo può essere usato anche nei programmi
Utilizzando il LD_PRELOAD
percorso, è 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.