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.
Liez-vous avec '-ldl'? –
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
Lier quoi, mon programme ou compiler la bibliothèque à LD_PRELOADed? – pythonic