fișierele executabile pot fi codificate manual în limbajul mașinii, deși este mult mai convenabil să dezvolți software ca cod sursă într-un limbaj de nivel înalt care poate fi ușor înțeles de oameni. În unele cazuri, codul sursă ar putea fi specificat în limbajul de asamblare, care rămâne lizibil de om, fiind în același timp strâns asociat cu instrucțiunile codului mașinii.
limbajul de nivel înalt este compilat fie într-un fișier de cod mașină executabil, fie într-un fișier obiect de cod mașină neexecutabil de un fel; procesul echivalent privind codul sursă al limbajului de asamblare se numește asamblare. Mai multe fișiere obiect sunt legate pentru a crea executabilul. Fișierele obiect-executabile sau nu – sunt de obicei stocate într-un format container, cum ar fi format executabil și Linkable (ELF) sau executabil portabil (PE) care este specific sistemului de Operare. Acest lucru dă structura codului mașinii generate, de exemplu, împărțind-o în secțiuni, cum ar fi .text (cod executabil), .date (variabile globale și statice inițializate) și .rodata (date numai în citire, cum ar fi constante și șiruri).
fișierele executabile includ de obicei și un sistem de rulare, care implementează caracteristici ale limbajului de rulare (cum ar fi programarea sarcinilor, gestionarea excepțiilor, apelarea constructorilor și distrugătorilor statici etc.) și interacțiunile cu sistemul de operare, în special trecerea argumentelor, mediul și returnarea unei stări de ieșire, împreună cu alte funcții de pornire și oprire, cum ar fi eliberarea resurselor, cum ar fi mânerele fișierelor. Pentru C, acest lucru se face prin conectarea în obiectul crt0, care conține punctul de intrare real și face configurarea și oprirea apelând biblioteca runtime.
fișierele executabile conțin în mod normal un cod suplimentar semnificativ al mașinii dincolo de cel generat direct din codul sursă specific. În unele cazuri, este de dorit să omitem acest lucru, de exemplu pentru dezvoltarea sistemelor încorporate sau pur și simplu pentru a înțelege cum funcționează compilarea, legarea și încărcarea. În C, acest lucru se poate face omițând timpul de rulare obișnuit și, în schimb, specificând în mod explicit un script linker, care generează punctul de intrare și gestionează pornirea și oprirea, cum ar fi apelarea main
pentru a porni și a returna starea de ieșire la kernel la sfârșit.