我试图用LD_PRELOAD覆盖一些标准库函数。 不过,我注意到我的版本从来没有被调用过一些函数,例如gettimeofday
one。 我怀疑海湾合作委员会使用这些function的内置版本。
有没有办法告诉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位)上测试了这一点。