Sono sicuro che sull'argomento, su questo stesso fòro, c'è chi ne sa di gran lunga piú di me. A ogni modo, da ex appassionato di programmazione, vorrei provare a dare qualche (semplice) indicazione.
Intanto, di solito il [codice] sorgente è definito
aperto, mentre è il programma a essere
libero. Un programma libero garantisce all'utente delle libertà fondamentali che sono quella di eseguirlo, di studiarne il sorgente, di modificarlo e di (ri)distribuirlo, anche in forma modificata.
Ovvio che queste libertà ricadono anche sul sorgente (cioè il sorgente dev'essere
aperto, quindi disponibile, per poterlo modificare).
Un sorgente aperto, viceversa, non necessariamente garantisce la
libertà di modificare o ridistribuire il programma.
In attesa di correzioni e aggiunte da parte di chi è sicuramente piú esperto (penso a qualche nostro utente
Linux 
), la rimando a qualche articolo specifico, come
questo, sperando che riesca a dipanare i suoi dubbi.
