As far as I know some math functions are contained in libc, while others are in libm. I've discovered that experimentally:
$ nm --dynamic --defined-only /lib/x86_64-linux-gnu/libm.so.6 | grep -w abs
$ nm --dynamic --defined-only /lib/x86_64-linux-gnu/libc.so.6 | grep -w abs
T abs
Is there a requirement concerning which mathematical functions must be provided by libm? Does libc and libm together provide all the math functions required by C standard?
Language standards such as ISO C and ISO C++ do not concern themselves with matters such as linking.
POSIX only requires that the
c99compiler supports-lm, and that the functions declared in the headers<math.h>,<complex.h>and<fenv.h>are available for linking if-lmis specified. It is possible to meet this requirement if functions are defined in a library which is linked in by default.With current glibc, the split of functions is mostly arbitrary, subject to a few limitations in the current implementation. (A long time ago, two threading libraries were supported, so all thread-related functionality had to go into
libpthread, but this is no longer the case.) Other approaches are possible: musl puts everything intolibc.afor static linking, and into the dynamic linker for dynamic linking.