2012-05-22 6 views
2

Pour tester LD_PRELOAD, j'ai écrit le mien getpid, qui imprime quelque chose avant d'appeler l'original getpid en utilisant dlsym. Le code est donné ci-dessous.LD_PRELOAD ne fonctionne pas avec mon programme

#define _GNU_SOURCE 

#include <unistd.h> 
#include <stdio.h> 
#include <dlfcn.h> 

typedef pid_t (*getpidType)(void); 

pid_t getpid(void) 
{ 
    printf("Hello, getpid!\n"); 
    getpidType f = (getpidType)dlsym(RTLD_NEXT, "getpid"); 
    return f(); 
} 

Cependant quand j'utiliser ce getpid dans mon programme et l'exécuter en utilisant LD_PRELOAD, en tapant LD_PRELOAD=./prelib.so ./prog, je reçois l'erreur suivante. Mais si je fais LD_PRELOAD=./prelib.so bash -c 'echo $$', il n'y a pas une telle erreur. Une idée de ce qui se passe ici.

+5

Liez-vous avec '-ldl'? –

+0

L'avez-vous "exporté"? C'est à dire. 'exporter LD_PRELOAD' par la suite. C'est une variable d'environnement, donc elle doit être exportée comme ça à un moment donné. – FatalError

+0

Lier quoi, mon programme ou compiler la bibliothèque à LD_PRELOADed? – pythonic

Répondre

4

Le lier avec libdl.so.2 en utilisant -ldl dans le makefile a résolu le problème.

Questions connexes