为什么使用sqrt的程序使用gcc编译而不指定数学库

时间:2015-10-01 23:02:57

标签: linux gcc libm

给出以下程序:

#include <math.h>
#include <stdio.h>

int
main(void)
{
    double x = sqrt(2);
    printf("The square root of two is %f\n", x);
    return 0;
}

并编译:

gcc calc.c -o calc

成功?为什么不需要-lm或/usr/lib/blah/libm.so.x

用ldd检查二进制对象产生:

linux-vdso.so.1 (0x00007fff4f5e5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007feeffd1b000)
/lib64/ld-linux-x86-64.so.2 (0x00007fef000e1000

没有引用libm。但是,如果我使用nm -D查看libc.so.6库或ld-linux-x86-64.so.2库,那些库中就没有sqrt函数。

这里发生了什么? gcc是否神奇地包含了一组默认的常用函数?

1 个答案:

答案 0 :(得分:3)

不,gcc编译器知道sqrt(2)是一个常量值,只是在编译时计算该值。

要触发使用sqrt()库函数,请使用以下代码:

volatile double y = 2;
double x = sqrt(y);

也可以使用-ffreestanding gcc选项,但不建议这样做。