为了测试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链接可以解决该问题。

08-19 00:50