En eksekverbar fil er et sæt instruktioner, der får en computer til at udføre en bestemt opgave [1] . I modsætning til en tekstfil , som er designet til at blive læst af et menneske, er en eksekverbar fil designet til at blive læst (og eksekveret) af en processor .
Ved "instruktioner" forstås traditionelt maskinkode , som udføres direkte af en fysisk processor [2] . I nogle tilfælde kan en fil, der indeholder instruktioner fra et mellemprogrammeringssprogsscript (såsom bytecode ) , også betragtes som eksekverbar.
Eksekverbare filer kan oprettes manuelt i maskinsprog, men denne tilgang bruges normalt ikke på grund af manglen på syntaks og læsbarhed af koden som sådan, så det er meget mere bekvemt at udvikle eksekverbare programmer i et programmeringssprog på højt niveau , der er let at forstå. I nogle tilfælde kan kildekoden være i assemblersprog , som forbliver læsbar af mennesker, mens den stadig er designet til at fungere med maskinkodeinstruktioner.
Sprogkode på højt niveau kompileres til maskinkodeobjektfiler , der ikke er eksekverbare. Koden kan derefter linkes til en eksekverbar fil. Denne proces kaldes linking i assemblersprog . Objektfiler, afhængigt af operativsystemet, gemmes normalt i et containerformat (hvori forskellige data er indeholdt i én fil), såsom Executable and Linkable Format (ELF) for Unix-lignende systemer eller Portable Executable (PE) til Windows [3] . Det giver struktur til indbygget kode ved at opdele det i sektioner såsom .text (eksekverbar kode), .data (initialiserede globale og statiske variabler) og .rodata (skrivebeskyttede data såsom konstanter og strenge).
Eksekverbare filer inkluderer typisk en runtime , som implementerer runtimes programmeringssprog og compilerfunktioner (såsom planlægning , undtagelseshåndtering , kalder statiske konstruktører og destruktorer osv.) og interaktion med operativsystemet, især argumentoverførsel, miljøer og returkode . med andre programstart- og slutfunktioner, der ikke er specificeret af programmøren, men af værdi for efterfølgende arbejde, såsom eksekvering af ressourcer. I C gøres dette ved, at linkeren forbinder crt0 -objektfilen til en eksekverbar fil, der indeholder udførelsespunktet , udfører opsætningen og afslutter med et kald til runtime-biblioteket [4] .
Således indeholder eksekverbare filer normalt yderligere maskinkode, der genereres af compileren på en bestemt måde fra kildekoden. Det er ønskeligt at springe dette over i nogle tilfælde, for eksempel for at udvikle indlejrede systemer eller blot for at forstå, hvordan kompilering, linkning og indlæsning fungerer. I C kan du omgå standard runtime ved at specificere et linker-script direkte, for eksempel kalde mainen funktion til at køre programmet og returnere exit-status til kernen [5] .
For at blive eksekveret af et operativsystem , firmware eller bootloader skal den eksekverbare være i overensstemmelse med Application Binary Interface (ABI) [6] . I simple grænseflader udføres en fil ved at indlæse i hukommelsen, hoppe til begyndelsen af adresserummet og udføre derfra. I mere komplekse grænseflader har eksekverbare ekstra data, der definerer et separat indgangspunkt. For eksempel i ELF er indgangspunktet angivet i headeren e_entry, som angiver den (virtuelle) hukommelsesadresse, hvor eksekveringen skal starte. I GCC indstilles input af linkeren ved hjælp af _start.