如何告诉gcc不使用内置函数

5

我想使用LD_PRELOAD覆盖一些标准库函数。但是,我发现我的版本没有被一些函数调用,例如gettimeofday。我怀疑gcc对某些函数使用了内置版本。

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


2
你已经得到了关于问题本身的答案。但是 gettimeofday 是内置函数的可能性很小。因此,很可能你正在错误的方向上寻找。 - Jens Gustedt
2个回答

3
你正在处理错误的问题。我认为你的代码或编译预加载库的方式存在问题。
我在使用interposing 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

请注意,我在Ubuntu(64位)和CentOS 6.3(32位)中进行了测试,它们使用不同的C库。

你说得对,我实际上忘记在添加gettimeofday函数后重新编译我的库了 :)! - pythonic

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接