给定以下程序:
#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 是否神奇地包含了一组默认的常用函数或其他东西?