5

LD_PRELOAD を使用していくつかの標準ライブラリ関数をオーバーライドしようとしています。ただし、私のバージョンは、たとえば のような一部の関数に対して呼び出されないことに気付きましたgettimeofday。gcc は、これらの機能の一部に組み込みバージョンを使用していると思われます。

組み込みの標準ライブラリ関数を使用しないように gcc に指示する方法はありますか。

4

2 に答える 2

3

あなたは間違った問題を修正しています。コードまたはプリロードされたライブラリのコンパイル方法に問題があると思います。

介在には何の問題もありませんgettimeofday()。これを考慮してくださいlibgettimeofday.c

#include <sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone *tz __attribute__((unused)) )
{
    tv->tv_sec = 1;
    tv->tv_usec = 2;
    return 0;
}

そしてこれgettimeofday.c

#include <stdio.h>
#include <sys/time.h>
int main(void)
{
    struct timeval  t;
    gettimeofday(&t, NULL);
    printf("%ld.%06d\n", (long)t.tv_sec, (int)t.tv_usec);
    return 0;
}

を使用してコンパイル

gcc -W -Wall gettimeofday.c -o gettimeofday
gcc -W -Wall -fPIC libgettimeofday.c -ldl -shared -Wl,-soname,libgettimeofday.so -o libgettimeofday.so || exit $?

そしてテスト:

$ ./gettimeofday
1355243621.698927

$ LD_PRELOAD=./libgettimeofday.so ./gettimeofday
1.000002

異なる C ライブラリを使用する Ubuntu (64 ビット) と CentOS 6.3 (32 ビット) の両方でこれをテストしたことに注意してください。

于 2012-12-11T16:41:29.340 に答える