¿Qué es el formato de archivo SO?
Un archivo .so contiene una biblioteca compartida cargada dinámicamente para aplicaciones Unix y Linux. .so es un archivo binario utilizado para proporcionar acceso a código y datos compartidos que uno o más programas pueden usar al iniciarse. La extensión significa «Shared Object» (Objeto Compartido), lo que refleja el hecho de que una vez que la biblioteca se carga en la memoria, sus objetos -funciones y datos- pueden ser accedidos por múltiples procesos simultáneamente. El tipo MIME registrado para los archivos .so es application/x-sharedlib.
Las bibliotecas .so son objetos ELF (siglas de Executable and Linkable Format), el formato binario estándar utilizado en Linux y muchos sistemas tipo Unix para ejecutables, objetos compilados, bibliotecas compartidas y volcados de memoria (core dumps). Todo archivo ELF válido -incluidos los archivos .so- comienza con el número mágico de cuatro bytes \x7FELF en el desplazamiento 0. La estructura del archivo comprende:
- Cabecera ELF - define la arquitectura, el endianismo y el número de bits (32 o 64 bits), además del recuento de entradas en las tablas de segmentos y secciones,
- Tabla de cabeceras de programa - describe los segmentos de memoria utilizados en el momento de la carga,
- Tabla de cabeceras de sección - describe las secciones individuales utilizadas por el enlazador y el depurador,
- Datos referenciados por esas cabeceras.
Los segmentos se utilizan durante la ejecución del programa y pueden estar compuestos por múltiples secciones; las secciones se utilizan durante la operación de enlazado. Los archivos .so pueden enlazarse a un programa en tiempo de compilación o cargarse en tiempo de ejecución mediante dlopen().
Los nombres de archivo .so siguen una convención de nomenclatura en la que el nombre de la biblioteca va precedido por un prefijo lib; por ejemplo, una biblioteca llamada abc tendrá el nombre de archivo libabc.so, y se utiliza el indicador -labc al enlazar contra ella. El sufijo .so puede ir seguido de un número de versión, como libabc.so.3 para el archivo de versión principal o libabc.so.3.1.2 para una compilación con versión completa. En la práctica, libabc.so suele ser solo un enlace simbólico que apunta al archivo versionado real, y libabc.so.3 puede ser a su vez un enlace simbólico a la versión compatible más reciente. La versión almacenada en la entrada dinámica DT_SONAME es lo que el enlazador de tiempo de ejecución ld.so registra y comprueba. Algunas bibliotecas de sistema de bajo nivel -como el propio ld.so- no siguen la convención del prefijo lib.
En Windows, el concepto equivalente es un archivo .DLL; en macOS es un archivo .dylib. Las alternativas estáticas en Linux se archivan en archivos .a.
Seguridad y protección
RIESGO: MEDIUMUn .so es código nativo ejecutable que se ejecuta dentro de cualquier proceso que lo cargue, por lo que una biblioteca compartida maliciosa puede hacer cualquier cosa que el programa anfitrión pueda. Los riesgos reales: (1) secuestro de biblioteca (library hijacking): un .so malicioso colocado donde el cargador busca primero, o el abuso de LD_PRELOAD/LD_LIBRARY_PATH, puede inyectar código en un programa legítimo; (2) descargar archivos .so individuales de sitios web aleatorios para corregir un error: estos pueden ser maliciosos o incompatibles con la ABI y pueden romper o comprometer el sistema. Instale siempre las bibliotecas desde los repositorios de paquetes firmados de su distribución. Eliminar archivos .so del sistema (en /lib, /usr/lib) puede hacer que el sistema operativo o las aplicaciones no arranquen.
Detalles del formato
en pocas palabrasProgramas que abren archivos SO
Detalles técnicos
especificación profunda| Tipo MIME | application/x-sharedlib |
| Bytes mágicos | 7F 45 4C 46 («\x7FELF») en el desplazamiento 0 del archivo; magia idéntica a todos los archivos ELF; el campo e_type distingue los objetos compartidos |
| Valor ELF e_type | ET_DYN (0x0003) - distingue un objeto compartido de un ejecutable (ET_EXEC = 0x0002) o un objeto reubicable (ET_REL = 0x0001) |
| Bits | Byte EI_CLASS en el desplazamiento 4: 1 = 32 bits (Elf32), 2 = 64 bits (Elf64); ambas variantes están ampliamente desplegadas en Linux |
| Endianismo | Byte EI_DATA en el desplazamiento 5: 1 = little-endian (ELFDATA2LSB), 2 = big-endian (ELFDATA2MSB); específico de la arquitectura |
| Código independiente de la posición | Debe compilarse con -fPIC para que la biblioteca pueda mapearse en cualquier dirección virtual sin conflictos de reubicación entre procesos |
| Tabla de símbolos dinámicos | La sección .dynsym exporta e importa símbolos visibles en tiempo de ejecución; .dynstr contiene las cadenas de nombres correspondientes |
| PLT / GOT | La Procedure Linkage Table y la Global Offset Table permiten la resolución de símbolos perezosa (por defecto) o inmediata (-z now) en el momento de la carga |
| soname (DT_SONAME) | Nombre canónico de la biblioteca incrustado en la sección dinámica ELF; ld.so registra este nombre cuando se enlaza un programa, lo que permite el seguimiento de la versión ABI independientemente del nombre del archivo |
| Versionado de símbolos | Las secciones .gnu.version y .gnu.version_r permiten múltiples versiones de símbolos dentro de un solo archivo, lo que posibilita la evolución de la ABI compatible con versiones anteriores |
| Enlazador de tiempo de ejecución | Cargado por ld.so / ld-linux-x86-64.so.2; ruta de búsqueda controlada por LD_LIBRARY_PATH, DT_RUNPATH, o /etc/ld.so.conf + caché de ldconfig |
| Convención de nomenclatura | lib<nombre>.so[.mayor[.menor.parche]]; libabc.so es normalmente un enlace simbólico de desarrollo → libabc.so.3 → libabc.so.3.1.2 |
| Ruta de búsqueda incrustada | Las entradas dinámicas DT_RPATH o DT_RUNPATH graban las rutas de búsqueda de bibliotecas en el archivo en el momento del enlazado; se prefiere DT_RUNPATH ya que puede ser anulado por LD_LIBRARY_PATH |
| Herramientas de inspección | readelf -a, objdump -d, nm --dynamic (binutils); ldd para el listado de dependencias; el comando file identifica el tipo ELF y la arquitectura |
| Lanzado | ELF format 1990s (System V Release 4); .so shared libraries are core to Linux/Unix |
| Estándar abierto | Sí · libre de regalías |
| Especificación | refspecs.linuxfoundation.org |
Conversiones de SO
Preguntas y respuestas de la comunidad
preguntado por usuariosAún no hay preguntas; sea el primero en preguntar sobre los archivos SO.