为了测试LD_PRELOAD,我写我自己getpid
,它调用原来之前打印的东西getpid
使用dlsym。 代码如下所示。
#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 $$'
,有没有这样的错误。 任何想法是怎么回事。