La Compilation è un'operazione prevalentemente a senso unico, e non è deterministica, almeno non in modo robusto.
potresti ricompilare il codice sorgente e vedere se produce lo stesso binario. Tuttavia, il binario esatto può variare a seconda di molti parametri, incluse le opzioni di compilazione e la versione esatta del compilatore utilizzato. Inoltre, alcuni compilatori incorporano alcuni "commenti" in file binari, commenti che di solito includono la versione del compilatore ma possono anche includere il "numero di build" (se tale numero è mantenuto) e, possibilmente, la data e l'ora di costruzione - in quel caso, tu non ottieni lo stesso binario, non l'ultimo byte. Se vuoi vedere se hai lo "stesso" binario, potresti quindi doverli prima rimuovere questi commenti (potrebbe essere utile il comando Unix strip
).
In senso stretto, la compilazione potrebbe essere casuale; poiché generare codice ottimale è un problema difficile, alcuni compilatori utilizzano algoritmi randomizzati che, euristicamente , sono in media buoni. Un simile compilatore potrebbe generare ogni volta un binario distinto. Poiché tale comportamento rende il debug molto più difficile, molti compilatori che si dedicano agli algoritmi euristici cercheranno comunque di essere riproducibili (cioè otterranno la loro casualità da un PRNG inizializzato con un valore specifico e configurabile).
C'è una soluzione molto più semplice: se hai il codice sorgente e puoi ricompilarlo, usa l'output di la tua ricompilazione.
Naturalmente, questo non risolve completamente il problema della fiducia; lo muove semplicemente. Durante la compilazione dalla fonte:
- ti devi fidare che il codice sorgente non contenga backdoor;
- devi fidarti del compilatore stesso per non giocare brutti scherzi con te.
Almeno, il codice sorgente è nominalmente leggibile dagli esseri umani (questo è il punto del codice sorgente), quindi è possibile eseguire alcune analisi del codice leggendolo (o facendolo leggere da uno specialista di cui ti fidi). Non esiste un modo noto per assicurarsi che una determinata parte di codice non contenga backdoor o vulnerabilità (altrimenti, questo significherebbe che abbiamo saputo come produrre codice privo di bug); tuttavia, è molto più difficile nascondere una backdoor nel codice sorgente che in un binario compilato.
Per quanto riguarda il compilatore, consulta questo articolo molto classico .