为了测试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 $$'
,则没有这样的错误。不知道这里发生了什么。
答案 0 :(得分:4)
使用makefile中的libdl.so.2
将其与-ldl
相关联解决了问题。