En körbar fil är en uppsättning instruktioner som får en dator att utföra en specifik uppgift [1] . Till skillnad från en textfil , som är designad för att läsas av en människa, är en körbar fil utformad för att läsas (och köras) av en processor .
Med "instruktioner" förstås traditionellt maskinkod , som exekveras direkt av en fysisk processor [2] . I vissa fall kan en fil som innehåller instruktioner från ett mellanliggande programmeringsspråksskript (som bytecode ) också anses vara körbar.
Körbara filer kan skapas för hand i maskinspråk, men detta tillvägagångssätt används vanligtvis inte på grund av bristen på syntax och läsbarhet för koden som sådan, så det är mycket bekvämare att utveckla körbara program i ett högnivåprogrammeringsspråk som är lätt att förstå. I vissa fall kan källkoden vara i assemblerspråk , som förblir läsbar för människor samtidigt som den är utformad för att fungera med maskinkodsinstruktioner.
Språkkod på hög nivå kompileras till maskinkodobjektfiler som inte är körbara. Koden kan sedan länkas till en körbar fil. Denna process kallas länkning i assemblerspråk . Objektfiler, beroende på operativsystem, lagras vanligtvis i ett containerformat (där olika data finns i en fil), såsom Executable and Linkable Format (ELF) för Unix-liknande system eller Portable Executable (PE) för Windows [3] . Den ger struktur åt inbyggd kod genom att dela upp den i sektioner som .text (körbar kod), .data (initierade globala och statiska variabler) och .rodata (skrivskyddad data som konstanter och strängar).
Körbara filer inkluderar vanligtvis en runtime , som implementerar körtidens programmeringsspråk och kompilatorfunktioner (såsom schemaläggning , undantagshantering , anrop av statiska konstruktörer och destruktorer, etc.) och interaktion med operativsystemet, särskilt argumentöverföring, miljöer och returkod , tillsammans med andra programstart- och slutfunktioner som inte specificeras av programmeraren men av värde för efterföljande arbete, såsom exekvering av resurser. I C görs detta genom att länken länkar crt0- objektfilen till en körbar fil som innehåller exekveringspunkten , utför installationen och avslutar med ett anrop till runtime-biblioteket [4] .
Således innehåller körbara filer vanligtvis ytterligare maskinkod som genereras av kompilatorn på ett visst sätt från källkoden. Det är önskvärt att hoppa över detta i vissa fall, till exempel för att utveckla inbyggda system eller helt enkelt för att förstå hur kompilering, länkning och laddning fungerar. I C kan du kringgå standardkörtiden genom att ange ett länkskript direkt, till exempel anropa mainen funktion för att köra programmet och returnera utgångsstatusen till kärnan [5] .
För att köras av ett operativsystem , firmware eller bootloader måste den körbara överensstämma med Application Binary Interface (ABI) [6] . I enkla gränssnitt exekveras en fil genom att laddas in i minnet, hoppa till början av adressutrymmet och köras därifrån. I mer komplexa gränssnitt har körbara filer ytterligare data som definierar en separat ingångspunkt. Till exempel i ELF anges ingångspunkten i rubriken e_entry, som anger den (virtuella) minnesadressen där exekveringen ska starta. I GCC ställs indata in av länken med hjälp av _start.