#include <math.h>
#include <stdio.h>
int main()
{
printf("%f", roundf(3.14));
}
上記のコードをコンパイルし (-lm を使用していません)、use ldd a.out を追加すると、結果は次のようになります。
linux-vdso.so.1 => (0x00007fffab9ff000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd6da0f8000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd6da4eb000)
a.out がlibmとリンクしなかったのに、roundf (または sqrt のようなもの) を使用できるのはなぜですか? nm を使用して libc.so.6 と ld-linux-x86064.so.2 をテストしましたが、これらすべてに roundf のシンボルがありませんでした。
roundf が定義されている場所、またはコンパイラによってインライン化されている場所を知りたいですか? (gcc 4.7.3 および gcc 4.6.3 でテスト)
答えはhttp://fedoraproject.org/w/index.php?title=UnderstandingDSOLinkChangeです。