I have a program which is linked (dynamically) with libm. There are also several plugins for this program. Plugins are loaded explicitely with dlopen(). Some of these plugins use round() from libm.
On one system (Linux Mint 19.1 gcc 7.5.0) the program does not work because of unresolved round.
Here is simple example:
Library (lib.c)
#include <stdio.h> #include <math.h> void func(double a, double b) { double c; c = round(a + b); printf("c = %lf\n", c); }Main program (main.c)
#include <stdio.h> #include <dlfcn.h> void *dll; void (*f)(double, double); double a = 1.234, b = 4.321; int main(void) { dll = dlopen("./lib.so", RTLD_LAZY); f = dlsym(dll, "func"); f(a,b); return 0; }Building (Makefile)
all: gcc -Wall -Os -shared -fPIC lib.c -o lib.so gcc -Wall -Os -rdynamic -fPIC main.c -o main -ldl -lmRun on Debian 8, gcc 4.9.2
./main c = 6.000000Run on Linux Mint 19.1, gcc 7.5.0
./main ./main: symbol lookup error: ./lib.so: undefined symbol: round
Now, add -lm for dll compilation
gcc -Wall -Os -shared -fPIC lib.c -o lib.so -lm
./main
c = 6.000000
So, the question is - why on this particular system one must use -lm not only for main program but for plugin also?