Hvad er SO-filformatet?
En .so-fil indeholder et dynamisk indlæst delt bibliotek til Unix- og Linux-applikationer. .so er en binær fil, der bruges til at give adgang til delt kode og data, som et eller flere programmer kan bruge, når de startes. Udvidelsen står for Shared Object, hvilket afspejler det faktum, at når biblioteket først er indlæst i hukommelsen, kan dets objekter - funktioner og data - tilgås af flere processer samtidigt. Den registrerede MIME-type for .so-filer er application/x-sharedlib.
.so-biblioteker er ELF-objekter (forkortelse for Executable and Linkable Format), som er det standardiserede binære format, der bruges på tværs af Linux og mange Unix-lignende systemer til eksekverbare filer, kompilerede objekter, delte biblioteker og core dumps. Enhver gyldig ELF-fil - inklusive .so-filer - begynder med det fire-byte magiske nummer \x7FELF ved offset 0. Filstrukturen består af:
- ELF-header - definerer arkitektur, endianness og bit-version (32-bit eller 64-bit), samt antallet af poster i segment- og sektionstabellerne,
- Program-headertabel - beskriver hukommelsessegmenter, der bruges ved indlæsning,
- Sektions-headertabel - beskriver individuelle sektioner, der bruges af linkeren og debuggeren,
- Data refereret af disse headere.
Segmenter bruges under programafvikling og kan bestå af flere sektioner; sektioner bruges under linking-processen. .so-filer kan linkes ind i et program ved kompilering eller indlæses ved kørsel via dlopen().
.so-filnavne følger en navngivningskonvention, hvor biblioteksnavnet indledes med et lib-præfiks - for eksempel vil et bibliotek ved navn abc have filnavnet libabc.so, og flaget -labc bruges ved linking mod det. .so-suffikset kan efterfølges af et versionsnummer, såsom libabc.so.3 for hovedversionsfilen eller libabc.so.3.1.2 for et fuldt versioneret build. I praksis er libabc.so ofte kun et symbolsk link, der peger på den rigtige versionerede fil, og libabc.so.3 kan i sig selv være et symlink til den nyeste kompatible udgivelse. Versionen gemt i den dynamiske post DT_SONAME er det, som runtime-linkeren ld.so registrerer og kontrollerer. Nogle lavniveau-systembiblioteker - såsom selve ld.so - følger ikke lib-præfiks-konventionen.
På Windows er det tilsvarende koncept en .DLL-fil; på macOS er det en .dylib-fil. Statiske alternativer på Linux er arkiveret i .a-filer.
Sikkerhed og tryghed
RISIKO: MEDIUMEn .so er eksekverbar native kode, der kører inde i den proces, der indlæser den, så et ondsindet delt bibliotek kan gøre alt, hvad værtsprogrammet kan. De reelle risici: (1) bibliotekskapring - en falsk .so placeret hvor indlæseren søger først, eller misbrug af LD_PRELOAD/LD_LIBRARY_PATH, kan injicere kode i et legitimt program; (2) download af individuelle .so-filer fra tilfældige hjemmesider for at rette en fejl - disse kan være ondsindede eller ABI-inkompatible og kan ødelægge eller kompromittere systemet. Installer altid biblioteker fra din distributions signerede pakke-arkiver. Sletning af system-.so-filer (i /lib, /usr/lib) kan gøre operativsystemet eller apps ude af stand til at starte.
Formatdetaljer
kort fortaltProgrammer der åbner SO-filer
Tekniske detaljer
dyb specifikation| MIME-type | application/x-sharedlib |
| Magic bytes | 7F 45 4C 46 ("\x7FELF") ved fil-offset 0 - identisk magi for alle ELF-filer; e_type-feltet skelner delte objekter |
| ELF e_type værdi | ET_DYN (0x0003) - skelner et delt objekt fra en eksekverbar fil (ET_EXEC = 0x0002) eller et relokerbart objekt (ET_REL = 0x0001) |
| Bitness | EI_CLASS byte ved offset 4: 1 = 32-bit (Elf32), 2 = 64-bit (Elf64); begge varianter er udbredte på Linux |
| Endianness | EI_DATA byte ved offset 5: 1 = little-endian (ELFDATA2LSB), 2 = big-endian (ELFDATA2MSB); arkitekturspecifik |
| Positionsuafhængig kode | Skal kompileres med -fPIC, så biblioteket kan mappes til enhver virtuel adresse uden relokeringskonflikter mellem processer |
| Dynamisk symboltabel | .dynsym-sektionen eksporterer og importerer symboler, der er synlige ved kørsel; .dynstr indeholder de tilsvarende navnestrenge |
| PLT / GOT | Procedure Linkage Table og Global Offset Table muliggør doven (standard) eller ivrig (-z now) symbolopløsning ved indlæsning |
| soname (DT_SONAME) | Kanonisk biblioteksnavn indlejret i den dynamiske ELF-sektion; ld.so registrerer dette navn, når et program linkes, hvilket muliggør sporing af ABI-version uafhængigt af filnavnet |
| Symbolversionering | .gnu.version og .gnu.version_r sektioner tillader flere symbolversioner i én fil, hvilket muliggør bagudkompatibel ABI-udvikling |
| Runtime-linker | Indlæses af ld.so / ld-linux-x86-64.so.2; søgesti kontrolleres af LD_LIBRARY_PATH, DT_RUNPATH eller /etc/ld.so.conf + ldconfig-cache |
| Navngivningskonvention | lib<navn>.so[.major[.minor.patch]]; libabc.so er typisk et udviklings-symlink → libabc.so.3 → libabc.so.3.1.2 |
| Indlejret søgesti | DT_RPATH eller DT_RUNPATH dynamiske poster indkoder bibliotekssøgestier i filen ved link-tid; DT_RUNPATH foretrækkes, da den kan tilsidesættes af LD_LIBRARY_PATH |
| Inspektionsværktøjer | readelf -a, objdump -d, nm --dynamic (binutils); ldd til liste over afhængigheder; file-kommando identificerer ELF-type og arkitektur |
| Udgivet | ELF format 1990s (System V Release 4); .so shared libraries are core to Linux/Unix |
| Åben standard | Ja · royaltyfri |
| Specifikation | refspecs.linuxfoundation.org |
SO-konverteringer
Fællesskabets Q&A
spurgt af brugereIngen spørgsmål endnu - vær den første til at spørge om SO-filer.