Для тестирования LD_PRELOAD я написал свой собственный getpid
, который печатает что-то перед вызовом оригинала getpid
с использованием dlsym. Код приведен ниже.LD_PRELOAD не работает с моей программой
#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();
}
Однако, когда я использую такой getpid
в моей программе и запустить его с помощью LD_PRELOAD, набрав LD_PRELOAD=./prelib.so ./prog
, я получаю следующее сообщение об ошибке.
./prog: symbol lookup error: ./prelib.so: undefined symbol: dlsym
Но если я LD_PRELOAD=./prelib.so bash -c 'echo $$'
, нет такой ошибки. Любая идея, что здесь происходит.
Вы ссылаетесь на '-ldl'? –
Вы «экспортировали» его? То есть 'export LD_PRELOAD' после этого. Это переменная среды, поэтому ее необходимо экспортировать, как в какой-то момент. – FatalError
Ссылка, что, моя программа или компиляция библиотеки LD_PRELOADed? – pythonic