Wat is het SO-bestandsformaat?
Een .so-bestand bevat een dynamisch geladen gedeelde bibliotheek voor Unix- en Linux-applicaties. .so is een binair bestand dat wordt gebruikt om toegang te bieden tot gedeelde code en gegevens die door een of meer programma's kunnen worden gebruikt wanneer ze worden gestart. De extensie staat voor Shared Object, wat verwijst naar het feit dat zodra de bibliotheek in het geheugen is geladen, de objecten ervan - functies en gegevens - gelijktijdig door meerdere processen kunnen worden benaderd. Het geregistreerde MIME-type voor .so-bestanden is application/x-sharedlib.
.so-bibliotheken zijn ELF-objecten (kort voor Executable and Linkable Format), het standaard binaire formaat dat wordt gebruikt op Linux en veel Unix-achtige systemen voor uitvoerbare bestanden, gecompileerde objecten, gedeelde bibliotheken en core-dumps. Elk geldig ELF-bestand - inclusief .so-bestanden - begint met het magische getal van vier bytes \x7FELF op positie 0. De bestandsstructuur bestaat uit:
- ELF-header - definieert architectuur, endianness en bitness (32-bit of 64-bit), plus het aantal vermeldingen in de segment- en sectietabellen,
- Programma-headertabel - beschrijft geheugensegmenten die tijdens het laden worden gebruikt,
- Sectie-headertabel - beschrijft individuele secties die worden gebruikt door de linker en debugger,
- Gegevens waarnaar door deze headers wordt verwezen.
Segmenten worden gebruikt tijdens de uitvoering van het programma en kunnen uit meerdere secties bestaan; secties worden gebruikt tijdens de koppelingsbewerking (linking). .so-bestanden kunnen tijdens het compileren aan een programma worden gekoppeld of tijdens runtime worden geladen via dlopen().
.so-bestandsnamen volgen een naamgevingsconventie waarbij de naam van de bibliotheek wordt voorafgegaan door een lib-prefix - een bibliotheek met de naam abc krijgt bijvoorbeeld de bestandsnaam libabc.so, en de vlag -labc wordt gebruikt bij het koppelen. Het .so-achtervoegsel kan worden gevolgd door een versienummer, zoals libabc.so.3 voor het hoofdversiebestand of libabc.so.3.1.2 voor een volledig geversioneerde build. In de praktijk is libabc.so vaak slechts een symbolische koppeling die naar het echte geversioneerde bestand verwijst, en libabc.so.3 kan zelf weer een symlink zijn naar de meest recente compatibele release. De versie die is opgeslagen in de dynamische vermelding DT_SONAME is wat de runtime-linker ld.so registreert en controleert. Sommige low-level systeembibliotheken - zoals ld.so zelf - volgen de lib-prefixconventie niet.
Op Windows is het equivalente concept een .DLL-bestand; op macOS is het een .dylib-bestand. Statische alternatieven op Linux worden gearchiveerd in .a-bestanden.
Beveiliging & veiligheid
RISICO: MEDIUMEen .so is uitvoerbare native code die draait binnen het proces dat hem laadt, dus een kwaadaardige gedeelde bibliotheek kan alles doen wat het gastprogramma kan. De reële risico's: (1) library hijacking - een malafide .so geplaatst op een plek waar de lader eerst zoekt, of misbruik van LD_PRELOAD/LD_LIBRARY_PATH, kan code injecteren in een legitiem programma; (2) het downloaden van individuele .so-bestanden van willekeurige websites om een fout te herstellen - deze kunnen kwaadaardig of ABI-incompatibel zijn en kunnen het systeem beschadigen of compromitteren. Installeer bibliotheken altijd vanuit de ondertekende pakketbronnen van uw distributie. Het verwijderen van systeem-.so-bestanden (in /lib, /usr/lib) kan het besturingssysteem of apps onbruikbaar maken.
Formaatdetails
in een notendopProgramma's die SO-bestanden openen
Technische details
diepe specificaties| MIME-type | application/x-sharedlib |
| Magic bytes | 7F 45 4C 46 ("\x7FELF") op bestandsoffset 0 - identieke magic voor alle ELF-bestanden; het e_type veld onderscheidt gedeelde objecten |
| ELF e_type waarde | ET_DYN (0x0003) - onderscheidt een gedeeld object van een uitvoerbaar bestand (ET_EXEC = 0x0002) of verplaatsbaar object (ET_REL = 0x0001) |
| Bitness | EI_CLASS byte op offset 4: 1 = 32-bit (Elf32), 2 = 64-bit (Elf64); beide varianten worden veelvuldig gebruikt op Linux |
| Endianness | EI_DATA byte op offset 5: 1 = little-endian (ELFDATA2LSB), 2 = big-endian (ELFDATA2MSB); architectuurafhankelijk |
| Positie-onafhankelijke code | Moet worden gecompileerd met -fPIC zodat de bibliotheek naar elk virtueel adres kan worden gemapt zonder relocatieconflicten tussen processen |
| Dynamische symbooltabel | .dynsym sectie exporteert en importeert symbolen die zichtbaar zijn tijdens runtime; .dynstr bevat de bijbehorende naamreeksen |
| PLT / GOT | Procedure Linkage Table en Global Offset Table maken lazy (standaard) of eager (-z now) symboolresolutie mogelijk tijdens het laden |
| soname (DT_SONAME) | Canonieke bibliotheeknaam ingebed in de dynamische ELF-sectie; ld.so registreert deze naam wanneer een programma wordt gekoppeld, wat ABI-versietracking onafhankelijk van de bestandsnaam mogelijk maakt |
| Symboolversiebeheer | .gnu.version en .gnu.version_r secties maken meerdere symboolversies binnen één bestand mogelijk, wat achterwaarts compatibele ABI-evolutie toestaat |
| Runtime-linker | Geladen door ld.so / ld-linux-x86-64.so.2; zoekpad beheerd door LD_LIBRARY_PATH, DT_RUNPATH, of /etc/ld.so.conf + ldconfig cache |
| Naamgevingsconventie | lib<naam>.so[.major[.minor.patch]]; libabc.so is doorgaans een ontwikkelings-symlink → libabc.so.3 → libabc.so.3.1.2 |
| Ingebed zoekpad | DT_RPATH of DT_RUNPATH dynamische vermeldingen bakken bibliotheekzoekpaden in het bestand tijdens het koppelen; DT_RUNPATH heeft de voorkeur omdat het kan worden overschreven door LD_LIBRARY_PATH |
| Inspectietools | readelf -a, objdump -d, nm --dynamic (binutils); ldd voor het weergeven van afhankelijkheden; file-commando identificeert ELF-type en architectuur |
| Uitgebracht | ELF format 1990s (System V Release 4); .so shared libraries are core to Linux/Unix |
| Open standaard | Ja · royaltyvrij |
| Specificatie | refspecs.linuxfoundation.org |
SO conversies
Community V&A
gevraagd door gebruikersNog geen vragen - wees de eerste om iets te vragen over SO-bestanden.