Hva er SO-filformatet?
En .so-fil inneholder et dynamisk lastet delt bibliotek for Unix- og Linux-applikasjoner. .so er en binærfil som brukes til å gi tilgang til delt kode og data som ett eller flere programmer kan bruke når de startes. Filendelsen står for Shared Object, noe som gjenspeiler det faktum at når biblioteket er lastet inn i minnet, kan dets objekter - funksjoner og data - aksesseres av flere prosesser samtidig. MIME-typen som er registrert for .so-filer er application/x-sharedlib.
.so-biblioteker er ELF-objekter (forkortelse for Executable and Linkable Format), standard binærformat som brukes på tvers av Linux og mange Unix-lignende systemer for kjørbare filer, kompilerte objekter, delte biblioteker og «core dumps». Enhver gyldig ELF-fil - inkludert .so-filer - starter med det fire-byte magiske tallet \x7FELF ved posisjon 0. Filstrukturen består av:
- ELF-hode - definerer arkitektur, endianness og bit-versjon (32-bit eller 64-bit), pluss antall oppføringer i segment- og seksjonstabellene,
- Programhodetabell - beskriver minnesegmenter som brukes ved lasting,
- Seksjonshodetabell - beskriver individuelle seksjoner som brukes av linkeren og debuggeren,
- Data referert til av disse hodene.
Segmenter brukes under programkjøring og kan være sammensatt av flere seksjoner; seksjoner brukes under linking-operasjonen. .so-filer kan linkes inn i et program ved kompilering eller lastes ved kjøretid via dlopen().
.so-filnavn følger en navnekonvensjon der biblioteknavnet har et lib-prefiks - for eksempel vil et bibliotek med navn abc ha filnavnet libabc.so, og flagget -labc brukes ved linking mot det. .so-suffikset kan etterfølges av et versjonsnummer, slik som libabc.so.3 for hovedversjonsfilen eller libabc.so.3.1.2 for et fullstendig versjonert bygg. I praksis er libabc.so ofte bare en symbolsk lenke som peker til den faktiske versjonerte filen, og libabc.so.3 kan i seg selv være en symlink til den nyeste kompatible utgivelsen. Versjonen lagret i den dynamiske oppføringen DT_SONAME er det runtime-linkeren ld.so registrerer og sjekker. Noen lavnivå systembiblioteker - som ld.so selv - følger ikke lib-prefiks-konvensjonen.
På Windows er det tilsvarende konseptet en .DLL-fil; på macOS er det en .dylib-fil. Statiske alternativer på Linux arkiveres i .a-filer.
Sikkerhet og trygghet
RISIKO: MEDIUMEn .so er kjørebar maskinkode som kjører inne i prosessen som laster den, så et ondsinnet delt bibliotek kan gjøre alt vertsprogrammet kan. De reelle risikoene: (1) bibliotek-kapring - en falsk .so plassert der lasteren søker først, eller misbruk av LD_PRELOAD/LD_LIBRARY_PATH, kan injisere kode i et legitimt program; (2) nedlasting av individuelle .so-filer fra tilfeldige nettsteder for å fikse en feil - disse kan være ondsinnede eller ABI-inkompatible og kan ødelegge eller kompromittere systemet. Installer alltid biblioteker fra din distribusjons signerte pakkebrønner. Sletting av systemets .so-filer (i /lib, /usr/lib) kan gjøre at OS eller apper ikke lenger kan starte.
Formatdetaljer
i et nøtteskallProgrammer som åpner SO-filer
Tekniske detaljer
dyp spesifikasjon| MIME-type | application/x-sharedlib |
| Magic bytes | 7F 45 4C 46 ("\x7FELF") ved filposisjon 0 - identisk magi for alle ELF-filer; e_type-feltet skiller delte objekter |
| Bit-versjon | EI_CLASS-byte ved posisjon 4: 1 = 32-bit (Elf32), 2 = 64-bit (Elf64); begge varianter er utbredt på Linux |
| Endianness | EI_DATA-byte ved posisjon 5: 1 = little-endian (ELFDATA2LSB), 2 = big-endian (ELFDATA2MSB); arkitekturspesifikk |
| Posisjonsuavhengig kode | Må kompileres med -fPIC slik at biblioteket kan mappes til enhver virtuell adresse uten relokeringskonflikter mellom prosesser |
| Dynamisk symboltabell | .dynsym-seksjonen eksporterer og importerer symboler synlige ved kjøretid; .dynstr inneholder de tilsvarende navnestringene |
| PLT / GOT | Procedure Linkage Table og Global Offset Table muliggjør lat (standard) eller ivrig (-z now) symboloppløsning ved lasting |
| soname (DT_SONAME) | Kanonisk biblioteknavn innebygd i den dynamiske ELF-seksjonen; ld.so registrerer dette navnet når et program linkes, noe som muliggjør sporing av ABI-versjon uavhengig av filnavn |
| Symbolversjonering | .gnu.version- og .gnu.version_r-seksjoner tillater flere symbolversjoner i én fil, noe som muliggjør bakoverkompatibel ABI-evolusjon |
| Runtime-linker | Lastet av ld.so / ld-linux-x86-64.so.2; søkesti kontrollert av LD_LIBRARY_PATH, DT_RUNPATH, eller /etc/ld.so.conf + ldconfig-buffer |
| Navnekonvensjon | lib<navn>.so[.major[.minor.patch]]; libabc.so er vanligvis en utviklings-symlink → libabc.so.3 → libabc.so.3.1.2 |
| Innebygd søkesti | DT_RPATH eller DT_RUNPATH dynamiske oppføringer baker søkestier for biblioteker inn i filen ved linking; DT_RUNPATH foretrekkes da den kan overstyres av LD_LIBRARY_PATH |
| Inspeksjonsverktøy | readelf -a, objdump -d, nm --dynamic (binutils); ldd for listing av avhengigheter; file-kommandoen identifiserer ELF-type og arkitektur |
| Utgitt | ELF format 1990s (System V Release 4); .so shared libraries are core to Linux/Unix |
| Åpen standard | Ja · royalty-fri |
| Spesifikasjon | refspecs.linuxfoundation.org |
SO-konverteringer
Spørsmål og svar fra fellesskapet
spurt av brukereIngen spørsmål ennå - vær den første til å spørre om SO-filer.