2011-12-12 9 views
11

Quando provo ad usare LD_PRELOAD come seguendo,ERRORE: ld.so: oggetto 'getpid.so' dal LD_PRELOAD non può essere precaricato: ignorato

LD_PRELOAD=getpid.so ./testpid 

ottengo il seguente errore ...

ERROR: ld.so: object 'getpid.so' from LD_PRELOAD cannot be preloaded: ignored. 

compilo getpid.so utilizzando

gcc -Wall -fPIC -shared -o getpid.so getpid.c 

e contiene il seguente codice ...

// getpid.c 
#include <sys/syscall.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <stdio.h> 

pid_t getpid(void) 
{ 
    printf("Hello, world!\n"); 
    return syscall(SYS_getpid); 
} 

tespid.c codice constains che utilizza getpid come mostrato di seguito e che è compilato facendo

gcc testpid -o testpid.c 

Quale può essere il problema? Perché LD_PRELOAD non funziona?

// testpid.c 
#include <sys/syscall.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <stdio.h> 

int main() 
{ 
    printf("pid = %d!\n", getpid()); 

    return 0; 
} 

risposta

18

Sembra che il caricatore non è in grado di trovare getpid.so come non hai citato il percorso alla libreria.

Prova:

LD_PRELOAD=/full/path/to/getpid.so ./testpid 
+3

Verissimo! Invece di LD_PRELOAD = getpid.so ./testpid, dovrebbe essere LD_PRELOAD =./Getpid.so ./testpid. Ora sta funzionando. – MetallicPriest

+2

nel mio caso ho dovuto anche impostare 'LD_LIBRARY_PATH' e ottenere la versione a 64 bit della libreria. –