2

CライブラリのC関数への呼び出しをオーバーライドするために、この回答に従っています。

私はすべて正しくやったと思いますが、うまくいきません:

「DibOpen」関数をオーバーライドしたい。これは、アプリケーションの実行時に LD_PRELOAD 環境変数に渡すライブラリのコードです。

DIBSTATUS DibOpen(void **ctx, enum Board b)
{
    printf("look at me, I wrapped\n");

    static DIBSTATUS (*func)(void **, enum Board) = NULL;
    if(!func)
        func = dlsym(RTLD_NEXT, "DibOpen");
    printf("Overridden!\n");
    return func(pContextAddr, BoardType, BoardHdl);
}

nm lib.so | grep DibOpenショーの出力

000000000001d711 T DibOpen

このようにプログラムを実行すると

LD_PRELOAD=libPreload.so ./program

program-ldl でリンクしていますが、libdl.soldd programへのリンクが表示されません

で止まります

 symbol lookup error: libPreload.so: undefined symbol: dlsym

. これをさらにデバッグするにはどうすればよいですか? 私の間違いはどこですか?

4

1 に答える 1

5

共有ライブラリを作成する場合 ( で使用するかどうかに関係なく)、依存関係を解決するためLD_PRELOAD必要なすべてのライブラリに名前を付ける必要があります。(状況によっては、ed 共有オブジェクトは実行可能ファイルに依存してシンボルを提供することができますが、これに依存しないことをお勧めします。) この場合、に対してリンクする必要があります。Makefile の場合:dlopenlibPreload.solibdl

libPreload.so: x.o y.o z.o
        $(CC) -shared -Wl,-z,defs -Wl,--as-needed -o $@ $^ -ldl

このオプション-Wl,-z,defsは、共有ライブラリに未解決の未定義シンボルがある場合にエラーを発行するようリンカに指示するため、このタイプの将来の問題は早期に発見されます。このオプション-Wl,--as-neededは、未定義のシンボルを実際に満たさないライブラリへの依存関係を記録しないようにリンカーに指示します。これらはどちらもデフォルトでオンになっているはずですが、歴史的な理由からそうではありません。

于 2013-04-25T15:51:00.997 に答える