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

时间:2012-12-11 15:17:57

标签: c linux gcc

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

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

2 个答案:

答案 0 :(得分:3)

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

  

-fno-内置

     

不要识别不以“_ builtin ”作为前缀开头的内置函数。

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

答案 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位)中进行了测试。