LD_PRELOAD を使用していくつかの標準ライブラリ関数をオーバーライドしようとしています。ただし、私のバージョンは、たとえば のような一部の関数に対して呼び出されないことに気付きましたgettimeofday
。gcc は、これらの機能の一部に組み込みバージョンを使用していると思われます。
組み込みの標準ライブラリ関数を使用しないように gcc に指示する方法はありますか。
あなたは間違った問題を修正しています。コードまたはプリロードされたライブラリのコンパイル方法に問題があると思います。
介在には何の問題もありません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 ビット) の両方でこれをテストしたことに注意してください。