2012-05-22 4 views
2

Для тестирования 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 $$', нет такой ошибки. Любая идея, что здесь происходит.

+5

Вы ссылаетесь на '-ldl'? –

+0

Вы «экспортировали» его? То есть 'export LD_PRELOAD' после этого. Это переменная среды, поэтому ее необходимо экспортировать, как в какой-то момент. – FatalError

+0

Ссылка, что, моя программа или компиляция библиотеки LD_PRELOADed? – pythonic

ответ

4

Ссылка на него с libdl.so.2 с помощью -ldl в make-файле решила проблему.