Vad är filformatet SO?
En .so-fil innehåller ett dynamiskt laddat delat bibliotek för Unix- och Linux-applikationer. .so är en binär fil som används för att ge åtkomst till delad kod och data som ett eller flera program kan använda när de startas. Tillägget står för Shared Object, vilket speglar det faktum att när biblioteket väl har laddats in i minnet kan dess objekt - funktioner och data - nås av flera processer samtidigt. MIME-typen som registrerats för .so-filer är application/x-sharedlib.
.so-bibliotek är ELF-objekt (förkortning för Executable and Linkable Format), det standardiserade binärformatet som används i Linux och många Unix-liknande system för körbara filer, kompilerade objekt, delade bibliotek och core-dumpar. Varje giltig ELF-fil - inklusive .so-filer - börjar med det fyra byte långa magiska numret \x7FELF vid offset 0. Filstrukturen består av:
- ELF-header - definierar arkitektur, endianness och bitness (32-bitars eller 64-bitars), plus antalet poster i segment- och sektionstabellerna,
- Program-headertabell - beskriver minnessegment som används vid laddning,
- Sektions-headertabell - beskriver enskilda sektioner som används av länkaren och debuggern,
- Data som refereras av dessa headers.
Segment används under programkörning och kan bestå av flera sektioner; sektioner används under länkningsoperationen. .so-filer kan länkas in i ett program vid kompilering eller laddas vid körning via dlopen().
Filnamn för .so följer en namnkonvention där biblioteksnamnet föregås av prefixet lib - till exempel kommer ett bibliotek med namnet abc att ha filnamnet libabc.so, och flaggan -labc används vid länkning mot det. Suffixet .so kan följas av ett versionsnummer, såsom libabc.so.3 för huvudversionsfilen eller libabc.so.3.1.2 för en fullständigt versionerad build. I praktiken är libabc.so ofta bara en symbolisk länk som pekar på den verkliga versionerade filen, och libabc.so.3 kan i sig vara en symlänk till den senaste kompatibla utgåvan. Versionen som lagras i den dynamiska posten DT_SONAME är vad körtidslänkaren ld.so registrerar och kontrollerar. Vissa systembibliotek på låg nivå - som ld.so självt - följer inte lib-prefixkonventionen.
På Windows är motsvarande koncept en .DLL-fil; på macOS är det en .dylib-fil. Statiska alternativ på Linux arkiveras i .a-filer.
Säkerhet & trygghet
RISK: MEDIUMEn .so är körbar nativ kod som körs inuti den process som laddar den, så ett skadligt delat bibliotek kan göra allt som värdprogrammet kan. De verkliga riskerna: (1) bibliotekskapning (hijacking) - en falsk .so placerad där laddaren söker först, eller missbruk av LD_PRELOAD/LD_LIBRARY_PATH, kan injicera kod i ett legitimt program; (2) nedladdning av enskilda .so-filer från slumpmässiga webbplatser för att fixa ett fel - dessa kan vara skadliga eller ABI-inkompatibla och kan förstöra eller kompromettera systemet. Installera alltid bibliotek från din distributions signerade paketförråd. Att radera systemets .so-filer (i /lib, /usr/lib) kan göra att operativsystemet eller appar inte går att starta.
Formatdetaljer
i ett nötskalProgram som öppnar SO-filer
Tekniska detaljer
djup specifikation| MIME-typ | application/x-sharedlib |
| Magiska byte | 7F 45 4C 46 ("\x7FELF") vid fil-offset 0 - identisk magi för alla ELF-filer; fältet e_type skiljer delade objekt åt |
| ELF e_type-värde | ET_DYN (0x0003) - skiljer ett delat objekt från en körbar fil (ET_EXEC = 0x0002) eller ett relokerbart objekt (ET_REL = 0x0001) |
| Bitness | EI_CLASS-byte vid offset 4: 1 = 32-bitars (Elf32), 2 = 64-bitars (Elf64); båda varianterna används i stor utsträckning på Linux |
| Endianness | EI_DATA-byte vid offset 5: 1 = little-endian (ELFDATA2LSB), 2 = big-endian (ELFDATA2MSB); arkitekturspecifikt |
| Positionsoberoende kod | Måste kompileras med -fPIC så att biblioteket kan mappas till valfri virtuell adress utan relokeringskonflikter mellan processer |
| Dynamisk symboltabell | .dynsym-sektionen exporterar och importerar symboler som är synliga vid körning; .dynstr innehåller motsvarande namnsträngar |
| PLT / GOT | Procedure Linkage Table och Global Offset Table möjliggör lat (standard) eller ivrig (-z now) symbolupplösning vid laddning |
| soname (DT_SONAME) | Kanoniskt biblioteksnamn inbäddat i den dynamiska ELF-sektionen; ld.so registrerar detta namn när ett program länkas, vilket möjliggör spårning av ABI-version oberoende av filnamn |
| Symbolversionering | Sektionerna .gnu.version och .gnu.version_r tillåter flera symbolversioner inom en fil, vilket möjliggör bakåtkompatibel ABI-evolution |
| Körtidslänkare | Laddas av ld.so / ld-linux-x86-64.so.2; sökvägen styrs av LD_LIBRARY_PATH, DT_RUNPATH, eller /etc/ld.so.conf + ldconfig-cache |
| Namnkonvention | lib<namn>.so[.major[.minor.patch]]; libabc.so är vanligtvis en utvecklings-symlänk → libabc.so.3 → libabc.so.3.1.2 |
| Inbäddad sökväg | Dynamiska poster för DT_RPATH eller DT_RUNPATH bakar in sökvägar för bibliotekssökning i filen vid länkning; DT_RUNPATH föredras eftersom den kan åsidosättas av LD_LIBRARY_PATH |
| Inspektionsverktyg | readelf -a, objdump -d, nm --dynamic (binutils); ldd för beroendelista; kommandot 'file' identifierar ELF-typ och arkitektur |
| Släppt | ELF format 1990s (System V Release 4); .so shared libraries are core to Linux/Unix |
| Öppen standard | Ja · royaltyfri |
| Specifikation | refspecs.linuxfoundation.org |
SO-konverteringar
Frågor & svar
frågat av användareInga frågor än - bli den första att fråga om SO-filer.