Impostazione mia lib per LD_PRELOAD rende alcuni processi producono errori loader
Domanda
ottengo il seguente errore quando si tenta di eseguire uno script ho solo l'accesso di esecuzione per:
uname: symbol lookup error: /home/dumindara/random/sotest/a.out: undefined symbol: dlsym
Questo è dopo che ho impostato variabile d'ambiente LD_PRELOAD
a /home/dumindara/random/sotest/a.out
.
a.out
ha una funzione di test malloc
e chiamate dlsym
internamente.
Non capisco questo problema quando si esegue ls
. La maggior parte dei processi fanno questo errore. Perché accade questo e che cosa posso fare per farlo funzionare?
Soluzione
Presumo che il file a.out è un oggetto condiviso e non un movimento eseguibile e su ...
dlsym()
è una funzione della libreria libdl, che di solito risiede nell'oggetto condiviso libdl.so.2 sui moderni sistemi Linux.
io Hazzard una congettura che l'a.out oggetto condiviso non è legata ai libdl. Ciò significa che quando si precaricare in un semplice binario, come uname che non tirare in un sacco di altre librerie, libdl.so.2 non può essere tirato in e si ottiene un errore simbolo indefinito.
Se, d'altra parte, si precarico ad un binario che è collegato a ed infine tira in libdl.so.2, il vostro oggetto condiviso funziona bene.
mi piacerebbe verificare con ldd
se il proprio oggetto condiviso è legato contro libdl come dovrebbe, e anche ciò che le biblioteche sono direttamente o indirettamente tirato quando uname
e ls
run.
EDIT:
Ho appena confermato questo. Il modo per risolvere questo errore è quello di collegare il tuo oggetto condiviso contro libdl. L'aggiunta di -ldl
ai suoi LDFLAGS dovrebbe fare il trucco.
Altri suggerimenti
Sono in grado di commento alla risposta accettata, ma vale la pena ricordare qui che si possono incontrare problema di non avere libdl.so.2 collegato correttamente quando -ldl
viene utilizzato davanti a comando di compilazione (supponendo che il collegamento e la compilazione viene eseguito dallo stesso comando,. questo è possibile in quanto librerie LD_PRELOAD sono di solito basate su un file di origine)
Così chiamata gcc con -ldl
alla fine:
gcc -shared -fPIC fakeuname.c -o libfakeuname.so -ldl
Nel mio caso, avendo -ldl
anteriore ha provocato l'errore stesso in questione:
uname: symbol lookup error: ./libfakehostname.so: undefined symbol: dlsym