为了测试LD_PRELOAD,我编写了自己的getpid
,它会在使用dlsym调用原始getpid
之前打印出一些内容。代码如下。
#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 $$'
,则不会出现此类错误。不知道这是怎么回事。 最佳答案
通过使用makefile中的libdl.so.2
将其与-ldl
链接可以解决该问题。