我正在尝试使用 LD_PRELOAD 覆盖一些标准库函数。但是,我注意到我的版本从未被某些函数调用,例如,那个gettimeofday
。我怀疑 gcc 对其中一些功能使用了内置版本。
有没有办法告诉 gcc 不要使用内置的标准库函数。
使用 gcc 开关-fno-builtin
。引用 gcc 手册:
-fno-内置
不识别不以 ` _builtin ' 作为前缀的内置函数。
更多细节: http: //gcc.gnu.org/onlinedocs/gcc-3.0/gcc_3.html#SEC7
您正在解决错误的问题。我认为您的代码或编译预加载库的方式有问题。
我在插入时没有任何问题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 位)中对此进行了测试。