2

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 $$'、そのようなエラーはありません。ここで何が起こっているのか、どんな考えでも。

4

1 に答える 1

5

libdl.so.2メイクファイルで使用してリンクすると-ldl問題が解決しました。

于 2012-05-22T14:17:51.843 に答える