Che cos'è il formato di file SO?
Un file .so contiene una libreria condivisa caricata dinamicamente per applicazioni Unix e Linux. .so è un file binario utilizzato per fornire l'accesso a codice e dati condivisi che uno o più programmi possono utilizzare all'avvio. L'estensione sta per Shared Object, a indicare il fatto che una volta caricata la libreria in memoria, i suoi oggetti - funzioni e dati - possono essere accessibili da più processi simultaneamente. Il tipo MIME registrato per i file .so è application/x-sharedlib.
Le librerie .so sono oggetti ELF (acronimo di Executable and Linkable Format), il formato binario standard utilizzato su Linux e molti sistemi Unix-like per eseguibili, oggetti compilati, librerie condivise e core dump. Ogni file ELF valido - inclusi i file .so - inizia con il numero magico di quattro byte \x7FELF all'offset 0. La struttura del file comprende:
- Intestazione ELF - definisce architettura, endianness e bitness (32-bit o 64-bit), oltre al numero di voci nelle tabelle dei segmenti e delle sezioni,
- Tabella delle intestazioni del programma - descrive i segmenti di memoria utilizzati al momento del caricamento,
- Tabella delle intestazioni di sezione - descrive le singole sezioni utilizzate dal linker e dal debugger,
- Dati referenziati da tali intestazioni.
I segmenti vengono utilizzati durante l'esecuzione del programma e possono essere composti da più sezioni; le sezioni vengono utilizzate durante l'operazione di collegamento (linking). I file .so possono essere collegati a un programma in fase di compilazione o caricati a runtime tramite dlopen().
I nomi dei file .so seguono una convenzione di denominazione in cui il nome della libreria è preceduto dal prefisso lib - ad esempio, una libreria chiamata abc avrà il nome file libabc.so, e il flag -labc viene utilizzato per il collegamento ad essa. Il suffisso .so può essere seguito da un numero di versione, come libabc.so.3 per il file della versione principale o libabc.so.3.1.2 per una build con versione completa. In pratica, libabc.so è spesso solo un collegamento simbolico che punta al file con la versione reale, e libabc.so.3 può essere a sua volta un symlink alla release compatibile più recente. La versione memorizzata nella voce dinamica DT_SONAME è quella che il linker di runtime ld.so registra e controlla. Alcune librerie di sistema di basso livello - come lo stesso ld.so - non seguono la convenzione del prefisso lib.
Su Windows il concetto equivalente è un file .DLL; su macOS è un file .dylib. Le alternative statiche su Linux sono archiviate in file .a.
Sicurezza e incolumità
RISCHIO: MEDIUMUn .so è codice nativo eseguibile che gira all'interno di qualsiasi processo lo carichi, quindi una libreria condivisa malevola può fare tutto ciò che il programma ospite può fare. I rischi reali: (1) dirottamento della libreria (library hijacking) - un .so contraffatto posizionato dove il caricatore cerca per primo, o l'abuso di LD_PRELOAD/LD_LIBRARY_PATH, può iniettare codice in un programma legittimo; (2) scaricare singoli file .so da siti web casuali per correggere un errore - questi potrebbero essere malevoli o incompatibili con l'ABI e possono rompere o compromettere il sistema. Installa sempre le librerie dai repository dei pacchetti firmati della tua distribuzione. L'eliminazione dei file .so di sistema (in /lib, /usr/lib) può rendere il sistema operativo o le app non avviabili.
Dettagli del formato
in sintesiProgrammi che aprono file SO
Dettagli tecnici
specifiche approfondite| Tipo MIME | application/x-sharedlib |
| Magic bytes | 7F 45 4C 46 ("\x7FELF") all'offset 0 del file - magic identico a tutti i file ELF; il campo e_type distingue gli oggetti condivisi |
| Valore ELF e_type | ET_DYN (0x0003) - distingue un oggetto condiviso da un eseguibile (ET_EXEC = 0x0002) o da un oggetto rilocabile (ET_REL = 0x0001) |
| Bitness | Byte EI_CLASS all'offset 4: 1 = 32-bit (Elf32), 2 = 64-bit (Elf64); entrambe le varianti sono ampiamente diffuse su Linux |
| Endianness | Byte EI_DATA all'offset 5: 1 = little-endian (ELFDATA2LSB), 2 = big-endian (ELFDATA2MSB); specifico per l'architettura |
| Codice indipendente dalla posizione | Deve essere compilato con -fPIC in modo che la libreria possa essere mappata a qualsiasi indirizzo virtuale senza conflitti di rilocazione tra i processi |
| Tabella dei simboli dinamici | La sezione .dynsym esporta e importa simboli visibili a runtime; .dynstr contiene le stringhe dei nomi corrispondenti |
| PLT / GOT | La Procedure Linkage Table e la Global Offset Table consentono la risoluzione dei simboli lazy (predefinita) o eager (-z now) al momento del caricamento |
| soname (DT_SONAME) | Nome canonico della libreria incorporato nella sezione dinamica ELF; ld.so registra questo nome quando un programma viene collegato, consentendo il tracciamento della versione ABI indipendentemente dal nome del file |
| Versioning dei simboli | Le sezioni .gnu.version e .gnu.version_r consentono più versioni di simboli all'interno di un singolo file, permettendo l'evoluzione dell'ABI retrocompatibile |
| Linker di runtime | Caricato da ld.so / ld-linux-x86-64.so.2; percorso di ricerca controllato da LD_LIBRARY_PATH, DT_RUNPATH, o /etc/ld.so.conf + cache ldconfig |
| Convenzione di denominazione | lib<nome>.so[.major[.minor.patch]]; libabc.so è tipicamente un symlink di sviluppo → libabc.so.3 → libabc.so.3.1.2 |
| Percorso di ricerca incorporato | Le voci dinamiche DT_RPATH o DT_RUNPATH scrivono i percorsi di ricerca delle librerie nel file al momento del collegamento; DT_RUNPATH è preferito in quanto può essere sovrascritto da LD_LIBRARY_PATH |
| Strumenti di ispezione | readelf -a, objdump -d, nm --dynamic (binutils); ldd per l'elenco delle dipendenze; il comando file identifica il tipo ELF e l'architettura |
| Rilasciato | ELF format 1990s (System V Release 4); .so shared libraries are core to Linux/Unix |
| Standard aperto | Sì · royalty-free |
| Specifica | refspecs.linuxfoundation.org |
Conversioni SO
Domande e risposte della community
chiesto dagli utentiAncora nessuna domanda - sii il primo a chiedere informazioni sui file SO.