我正在尝试使用LD_PRELOAD覆盖一些标准库函数。但是,我注意到我的版本从未被调用过某些函数,例如gettimeofday
函数。我怀疑gcc使用内置版本来实现其中一些功能。
有没有办法告诉gcc不要使用内置的标准库函数。
答案 0 :(得分:3)
使用gcc开关-fno-builtin
。引自gcc手册:
-fno-内置
不要识别不以“_ builtin ”作为前缀开头的内置函数。
答案 1 :(得分: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位)中进行了测试。