ar (Unix)
Originalförfattare |
Ken Thompson , Dennis Ritchie ( AT&T Bell Laboratories ) |
---|---|
Utvecklare | Olika öppen källkod och kommersiella utvecklare |
Initial release | 3 november 1971 |
Skrivet i | C |
Operativ system | Unix , Unix-liknande , V , Plan 9 , Inferno |
Plattform | Cross-plattform |
Typ | Kommando |
Licens | Plan 9: MIT-licens |
Filnamnstillägg |
.a , .lib , .ar
|
---|---|
Internet mediatyp |
applikation/x-arkiv
|
Magiskt nummer | !<arch> |
Typ av format | arkivformat |
Behållare för | vanligtvis objektfiler ( .o , .obj ) |
Standard | Ej standardiserad, flera varianter finns |
Öppna format ? | Ja |
Arkiveringen , även känd som ar , är ett Unix- verktyg som upprätthåller grupper av filer som en enda arkivfil . Idag används ar i allmänhet endast för att skapa och uppdatera
statiska biblioteksfiler som länkredigeraren eller länken använder och för att generera .deb-paket för Debianfamiljen ; den kan användas för att skapa arkiv för alla ändamål, men har till stor del ersatts av tar
för andra ändamål än statiska bibliotek. En implementering av ar
ingår som en av GNU Binutils .
I Linux Standard Base (LSB) har ar
fasats ut och förväntas försvinna i en framtida version av den standarden. Den motivering som angavs var att "LSB inte inkluderar programvaruutvecklingsverktyg och inte heller specificerar .o och .a filformat."
Filformatdetaljer
ar-formatet har aldrig standardiserats; moderna arkiv är baserade på ett vanligt format med två huvudvarianter, BSD och System V (ursprungligen känd som COFF , och används också av GNU , ELF och Windows .)
Historiskt har det funnits andra varianter inklusive V6 , V7 , AIX (liten och stor) och Coherent, som alla skiljer sig avsevärt från det vanliga formatet.
Debians " .deb "-arkiv använder det vanliga formatet.
En ar-fil börjar med en global rubrik följt av en rubrik och datasektion för varje fil som lagras i ar-filen.
Varje datasektion är 2 byte justerad. Om det skulle sluta på en udda offset, används en nyrad ('\n', 0x0A) som utfyllnad.
Filsignatur
Filsignaturen är ett enda fält som innehåller den magiska ASCII-strängen "!<arch>"
följt av ett enda LF- kontrolltecken (0x0A).
Filhuvud
Varje fil som lagras i ett ar-arkiv innehåller en filhuvud för att lagra information om filen. Det vanliga formatet är följande. Numeriska värden är kodade i ASCII och alla värden är högerutfyllda med ASCII-mellanslag (0x20).
Offset | Längd | namn | Formatera |
---|---|---|---|
0 | 16 | Filidentifierare | ASCII |
16 | 12 | Tidsstämpel för filändring (i sekunder) | Decimal |
28 | 6 | Ägar-ID | Decimal |
34 | 6 | Grupp-ID | Decimal |
40 | 8 | Filläge (typ och behörighet) | Octal |
48 | 10 | Filstorlek i byte | Decimal |
58 | 2 | Avslutande tecken | 0x60 0x0A |
Eftersom rubrikerna endast innehåller utskrivbara ASCII-tecken och radmatningar, verkar därför ett arkiv som endast innehåller textfiler fortfarande vara en textfil i sig.
Medlemmarna är justerade till jämna bytegränser. "Varje arkivfilmedlem börjar på en jämn bytegräns; en ny rad infogas mellan filerna vid behov. Ändå återspeglar den angivna storleken filens faktiska storlek exklusive utfyllnad."
På grund av begränsningarna för filnamnslängd och format, utformade både GNU- och BSD-varianterna olika metoder för att lagra långa filnamn. Även om det vanliga formatet inte lider av år 2038-problemet gör och kan många implementeringar av ar-verktyget behöva modifieras i framtiden för att hantera korrekta tidsstämplar utöver 2147483647. En beskrivning av dessa tillägg finns i libbfd.
Beroende på formatet inkluderar många ar-implementeringar en global symboltabell (alias armap, katalog eller index) för snabblänkning utan att behöva skanna hela arkivet efter en symbol. POSIX känner igen den här funktionen och kräver ar implementeringar för att ha ett -s- alternativ
för att uppdatera den. De flesta implementeringar sätter det vid den första filposten.
BSD variant
BSD ar lagrar filnamn högerutfyllda med ASCII-mellanslag. Detta orsakar problem med mellanslag i filnamn. 4.4BSD ar lagrar utökade filnamn genom att placera strängen "#1/" följt av filnamnslängden i filnamnsfältet och lagra det riktiga filnamnet framför datasektionen.
BSD ar-verktyg hanterar traditionellt inte byggandet av en global symboluppslagstabell och delegerar denna uppgift till ett separat verktyg som heter ranlib , som infogar en arkitekturspecifik fil med namnet __.SYMDEF
som första arkivmedlem. Vissa ättlingar sätter ett mellanslag och "SORTED" efter namnet för att indikera en sorterad version. En 64-bitars variant som heter __.SYMDEF_64
finns på Darwin .
Sedan POSIX lade till kravet för alternativet -s
som en ersättning för ranlib, har dock nyare BSD ar-implementationer skrivits om för att ha denna funktion. FreeBSD lade i synnerhet SYMDEF-tabellformatet bort och anammade System V-stiltabellen.
System V (eller GNU) variant
System V ar använder ett '/'-tecken (0x2F) för att markera slutet på filnamnet; detta tillåter användning av mellanslag utan användning av ett utökat filnamn. Sedan lagrar den flera utökade filnamn i datadelen av en fil med namnet "//", denna post refereras till av framtida rubriker. En rubrik refererar till ett utökat filnamn genom att lagra ett "/" följt av en decimalförskjutning till början av filnamnet i datasektionen för utökat filnamn. Formatet för denna "//"-fil i sig är helt enkelt en lista över de långa filnamnen, var och en separerad av ett eller flera LF-tecken. Observera att decimalförskjutningarna är antalet tecken, inte rad- eller strängnummer i "//"-filen. Detta är vanligtvis den andra posten i filen, efter symboltabellen som alltid är den första.
System V ar använder det speciella filnamnet "/" för att ange att följande datainmatning innehåller en symboluppslagstabell, som används i ar-bibliotek för att påskynda åtkomsten. Denna symboltabell är uppbyggd i tre delar som registreras tillsammans som sammanhängande data.
- Ett 32-bitars big endian heltal, som ger antalet poster i tabellen.
- En uppsättning 32-bitars big endian heltal. En för varje symbol, registrerar positionen i arkivet för rubriken för filen som innehåller denna symbol.
- En uppsättning nollterminerade strängar. Var och en är ett symbolnamn och förekommer i samma ordning som listan över positioner i del 2.
Vissa System V-system använder inte formatet som beskrivs ovan för symboluppslagstabellen. För operativsystem som HP-UX 11.0 lagras denna information i en datastruktur baserad på SOM -filformatet.
Specialfilen "/" avslutas inte med en specifik sekvens; slutet antas när det sista symbolnamnet har lästs.
För att övervinna filstorleksbegränsningen på 4 GiB använder vissa operativsystem som Solaris 11.2 och GNU en variantuppslagstabell. Istället för 32-bitars heltal används 64-bitars heltal i symboluppslagstabellerna. Strängen "/SYM64/" istället för "/" används som identifierare för denna tabell
Windows variant
Windows (PE/COFF)-varianten är baserad på SysV/GNU-varianten. Den första posten "/" har samma layout som SysV/GNU-symboltabellen. Den andra posten är en annan "/", ett Microsoft-tillägg som lagrar en utökad symbolkorsreferenstabell. Den här är sorterad och använder heltal med små endian. Den tredje posten är den valfria "//" långa namndata som i SysV/GNU.
Tunt arkiv
Versionen av ar
i GNU binutils och Elfutils har ytterligare ett "tunt arkiv"-format med det magiska numret !<thin> . Ett tunt arkiv innehåller endast en symboltabell och referenser till filen. Filformatet är i huvudsak ett System V-formatarkiv där varje fil lagras utan datasektionerna. Varje filnamn lagras som ett "långt" filnamn och de ska lösas som om de vore symboliska länkar .
Exempel användning
För att skapa ett arkiv från filerna class1.o , class2.o , class3.o , skulle följande kommando användas:
ar rcs libclass.a class1.o class2.o class3.o
Unix-länkare, vanligtvis anropade genom C- kompilatorn cc
, kan läsa ar
-filer och extrahera objektfiler från dem, så om libclass.a
är ett arkiv som innehåller class1.o
, class2.o
och class3.o
, då
cc main.c libclass.a
eller (om libclass.a är placerad i standard bibliotekssökväg, som /usr/local/lib )
cc main.c -lclass
eller (under länkning)
ld ... main.o -lclass ...
är det samma som:
cc main.c class1.o class2.o class3.o
Se även
externa länkar
- The Single UNIX Specification , Version 4 från The Open Group : skapa och underhålla biblioteksarkiv – Shell and Utilities Reference,
- Plan 9 Programmerarmanual, volym 1 –
- Inferno General Commands Manual –
- Linux User Commands Manual –
- FreeBSD General Commands Manual –
- – Version 7 Unix Programmerarmanual
- FreeBSD File Formats Manual – en redogörelse för Unix-format –
-
32-bitars PA-RISC Run-time Architecture Document, HP-UX 11.0 Version 1.0, Hewlett-Packard, 1997. Se kapitel 4: Flyttbara bibliotek . Tillgänglig på [4] (devresource.hp.com)