Почему программа, использующая sqrt, компилируется с gcc без указания математической библиотеки

учитывая следующую программу:

#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. Однако, если я посмотрю на библиотеку libc.so.6 или библиотеку ld-linux-x86-64.so.2 с помощью nm -D, в этих библиотеках нет функции sqrt.

Что тут происходит? Является ли gcc волшебным образом включенным набором общих функций по умолчанию или чем-то еще?


person decuser    schedule 01.10.2015    source источник


Ответы (1)


Нет, компилятор gcc знает, что sqrt(2) является постоянным значением, и просто вычисляет значение во время компиляции.

Чтобы инициировать использование библиотечной функции sqrt(), используйте такой код:

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

Можно также использовать параметр -ffreestanding gcc, но это не рекомендуется.

person Turbo J    schedule 01.10.2015