31

open() システム コールを完全に引き継いで、おそらく実際のシステム コールをラップしてログを記録したいとします。これを行う 1 つの方法は、LD_PRELOAD を使用して、open() エントリ ポイントを引き継ぐ (ユーザーが作成した) 共有オブジェクト ライブラリをロードすることです。

次に、ユーザーが作成した open() ルーチンは、glibc 関数へのポインターを ing して呼び出して取得しopen()ますdlsym()

ただし、上記で提案したソリューションは動的なソリューションです。自分のopen()ラッパーを静的にリンクしたいとします。どうすればいいですか?メカニズムは同じだと思いますが、ユーザー定義open()と libcの間にシンボルの衝突があると思いopen()ます。

同じ目標を達成するための他のテクニックを共有してください。

4

2 に答える 2

62

が提供するラップ機能を使用できますld。からman ld:

--wrap symbolシンボルのラッパー関数を使用します。への未定義の参照 symbolは、 に解決され__wrap_symbolます。

への未定義の参照__real_symbolは、 に解決されsymbolます。

__wrap_したがって、ラッパー関数と__real_実際の関数を呼び出すときにプレフィックスを使用するだけです。簡単な例は次のとおりです。

malloc_wrapper.c:

#include <stdio.h>
void *__real_malloc (size_t);

/* This function wraps the real malloc */
void * __wrap_malloc (size_t size)
{
    void *lptr = __real_malloc(size);
    printf("Malloc: %lu bytes @%p\n", size, lptr);
    return lptr;
}

テスト アプリケーションtestapp.c:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    free(malloc(1024)); // malloc will resolve to __wrap_malloc
    return 0;
}

次に、アプリケーションをコンパイルします。

gcc -c malloc_wrapper.c
gcc -c testapp.c
gcc -Wl,-wrap,malloc testapp.o malloc_wrapper.o -o testapp

結果のアプリケーションの出力は次のようになります。

$ ./testapp
Malloc: 1024 bytes @0x20d8010
于 2010-09-07T21:35:30.197 に答える
3

シンボルは、コマンドラインにリストした順序でリンカーによって解決されるため、標準ライブラリの前にライブラリをリストした場合、優先度が高くなります。gccの場合、指定する必要があります

gcc <BLAH> -nodefaultlibs <BLAH BLAH> -lYOUR_LIB <OTHER_LIBS>

このようにして、ライブラリが検索され、最初に見つかります。

于 2010-09-07T21:39:46.957 に答える