5

我正在尝试使用 LD_PRELOAD 覆盖一些标准库函数。但是,我注意到我的版本从未被某些函数调用,例如,那个gettimeofday。我怀疑 gcc 对其中一些功能使用了内置版本。

有没有办法告诉 gcc 不要使用内置的标准库函数。

4

2 回答 2

3

使用 gcc 开关-fno-builtin。引用 gcc 手册:

-fno-内置

不识别不以 ` _builtin ' 作为前缀的内置函数。

更多细节: http: //gcc.gnu.org/onlinedocs/gcc-3.0/gcc_3.html#SEC7

于 2012-12-11T15:26:12.457 回答
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 位)中对此进行了测试。

于 2012-12-11T16:41:29.340 回答