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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top