LD_PRELOAD をテストするために、dlsym を使用しgetpid
てオリジナルを呼び出す前に何かを出力する独自のを作成しました。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 $$'
、そのようなエラーはありません。ここで何が起こっているのか、どんな考えでも。