Primero compilamos:
$ gcc -c holalib.c
Y luego llamamos al linker:
gcc -o hola hola.o
Como el código de la librería es compartido pueden leerlo varios programas al mismo tiempo. Es como si tuvieramos un libro compartido sobre la mesa y todos lo leemos al mismo tiempo.
Siguiendo con esta analogía, cada uno de los que leemos el código tenemos nuestra área de memoria y nuestra procesamiento separado. O sea que compartamos código con otras aplicaciones no implica que compartamos datos.
$ gcc -c holalib.c
$ ar rcs libhola.a holalib.o
$ ar t libhola.a
$ gcc -c -otest_holalib.o test_holalib.c
$ gcc -odemo test_holalib.o -L. -lhola
$ ls -l /usr/lib/libopencv_highgui*
$ ls -l /usr/lib/x86_64-linux-gnu/libopencv_highgui*
$ objdump -p /usr/lib/libopencv_highgui.so.2.3.1 | grep -i soname
/lib , /usr/lib , /usr/local/lib, /usr/lib/x86_64-linux-gnu
$ gcc -fPIC -g -c -Wall holalib.c
$ gcc -shared -Wl,-soname,libhola.so.1 -o libhola.so.1.0.1 holalib.o -lc
$ sudo mkdir /usr/local/lib/personal
$ sudo mv ./libhola* /usr/local/lib/personal
include /etc/ld.so.conf.d/*.conf
$ sudo vim /etc/ld.so.conf.d/personal.conf
# Personal libraries
/usr/local/lib/personal
$ sudo ldconfig
$ gcc -Wall -c -o test_holalib.o test_holalib.c
$ cd /usr/local/lib/personal
$ sudo ln -sf libhola.so.1 libhola.so
$ gcc -o demo test_holalib.o -L/usr/local/lib/personal/ -lhola
GCC por defecto elije compilar utilizando librerías compartidas.
Si queremos utilizar compilación estática deberemos especificar la ruta especifica (como vimos en estáticas).
Si usamos -lmylib se compilará como compartida.
$ gcc -Wall -o demo test_holalib_dl.c -ldl
Pregunta: Diferencias entre "librerías" y bibliotecas ...