3. LIBRERÍAS DINÁMICAS
• ¿Qué son las librerías dinámicas?
• ¿En qué se diferencian de las librerías estáticas?
• ¿Cuáles son sus ventajas e inconvenientes?
3
10. EMPAQUETANDO OBJECTOS
10
Ya he compilado varios objectos, ¿qué puedo hacer con ellos?
v3.o
particle.o
main.o
Ejecutable
v3.o
particle.o
Librería estática
v3.o
particle.o
Librería dinámica
Binario
Windows - PE (.exe)
Linux - ELF
macOS - Mach-O
Archivo de objectos
MSVC - (.lib)
GCC-like - (.a)
Binario
Windows - PE (.dll)
Linux - ELF (.so)
macOS - Mach-O (.dylib)
15. USANDO LIBRERÍAS DINÁMICAS
1. En tiempo de compilación
• g++ -o executable main.o -lsharedLib.so
2. En tiempo de ejecución
• Windows: LoadLibrary y GetProcAddress
• Unix: dlopen y dlsym
15
16. USANDO LIBRERÍAS DINÁMICAS
16
En tiempo de ejecución
#include <dlfcn.h>
typedef void (foo_ptr*)(int);
…
void *handle = dlopen("libShared.so", RTLD_LAZY);
…
foo_ptr foo = dlsym(handle, "foo");
…
foo(5);
17. USANDO LIBRERÍAS DINÁMICAS
17
¿Para qué sirve cargarlas en tiempo de ejecución?
Para cargar librerías que no se conocen en tiempo
de compilación y poder extender la aplicación
Plugins y add-ons
Cambiar el comportamiento sin cerrar la aplicación
Sólo cargar la librería cuando se necesite
19. ¿DÓNDE BUSCA LAS LIBRERÍAS
EN TIEMPO DE EJECUCIÓN?
19
Unix - Linux y macOS
1. Directorios del rpath
2. LD_LIBRARY_PATH (Linux) y DYLD_LIBRARY_PATH
(macOS)
3. Directorios del system search path: /etc/ld.so.conf y
/lib (Linux), /usr/lib, /usr/local/lib, etc
Windows
1. Directorio del ejecutable
2. Directorio del sistema: C:WindowsSystem32
3. Directorio de Windows: C:Windows
4. El directorio actual: CWD
5. Directorios listados en la variable de entorno PATH
20. RPATH
• Acrónimo de run-time search path
• Codifica el path en el que buscar librerías dinámicas tanto en
ejecutables como en otras librerías dinámicas
• ¿Por qué se usa? Para hacer los ejecutables/librerías más flexibles.
Distintas distros pueden desplegar librerías en sitios diferentes
20
Librería
@rpath/libShared.so
Ejecutable
rpath=/my/rpath
rpath=@executable_path
21. INYECTANDO UNA LIBRERÍA
En Unix se pueden inyectar librerías que el dynamic
loader cargará antes de buscar en esos search paths
Linux - LD_PRELOAD (1)
macOS - DYLD_INSERT_LIBRARIES (2)
(1) Linux sin SELinux. Por defecto suele estar deshabilitado
(2) macOS sin “Debugging Restrictions”. Por defecto está habilitado
21
26. LIBRERÍAS DINÁMICAS
(RELOADED)
• ¿Qué son las librerías dinámicas?
• ¿En qué se diferencian de las librerías estáticas?
• ¿Cuáles son sus ventajas e inconvenientes?
26