// fakePow.c
#include <math.h>
double pow(double b, double p)
{
return 6.0;
}
//main.c
#include <stdio.h>
#include <math.h>
int twice(int x)
{
if (x <= 0)
return 0;
return x * 2;
}
int main()
{
int x = pow(10, 2);
int res = twice(x);
printf("%d\n", res);
return 0;
}
首先,我尝试了简单的编译,它不起作用,它返回200而不是12
gcc -c main.c
gcc -c fakePow.c
gcc main.o fakePow.o -o main
./main
200
然后我用google找到了LD_PRELOAD,但它也不起作用,因为它返回200而不是12
gcc -c main.c
gcc -shared -o ./fakePow.so ./fakePow.c
LD_PRELOAD=./fakePow.so ./main
200
这是从头开始模拟纯 C 函数的有效方法吗?
不。 C 编译器可能具有标准库例程的内置知识,并且您的编译器在编译期间使用该知识来评估
pow(10, 2)
,无论您为函数提供什么定义。这是 C 标准允许的,因为标准库例程的名称是保留的,这意味着如果程序尝试将它们用于任何其他目的,则不会定义行为。
您的编译器可能有一个开关来关闭标准库例程的知识。使用 Clang 和 GCC,您可以使用
-fno-builtin-function
禁用将 function
视为已知函数,或使用 -fno-builtin
禁用所有内置函数的知识。