我想使用LD_PRELOAD覆盖一些标准库函数。但是,我发现我的版本没有被一些函数调用,例如gettimeofday
。我怀疑gcc对某些函数使用了内置版本。
有没有办法告诉gcc不要使用内置的标准库函数呢?
#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
-fno-builtin
。引用自gcc手册:
更多细节请参考:http://gcc.gnu.org/onlinedocs/gcc-3.0/gcc_3.html#SEC7。-fno-builtin
不识别以 `_builtin' 为前缀的内置函数。
gettimeofday
是内置函数的可能性很小。因此,很可能你正在错误的方向上寻找。 - Jens Gustedt