Una delle migliori / peggiori innovazioni software Microsoft (ideale per la compatibilità, terribile per l'efficienza) è stata la configurazione Side by Side di Windows. Ciò consente, tra le altre cose, che componenti diversi di un programma possano avere più versioni delle librerie di runtime C / C ++ caricate nello stesso processo.
Questo mi ha sempre colpito per l'eccellente compatibilità con le versioni precedenti che offre. Ad esempio, è possibile eseguire un programma antico che si collega a runtime di C / C ++ molto vecchi e collegarlo o iniettare dinamicamente una nuova DLL che dipende da un nuovo runtime di C / C ++ e tutte le istanze separate dei runtime coesisteranno simultaneamente all'interno dello spazio degli indirizzi e saranno chiamati dall'assemblea che li fa riferimento.
Su Linux, tuttavia, i binari per i quali la sorgente non è disponibile tendono a "marcire" nel tempo, piuttosto rapidamente. Il motivo è che i programmi più interessanti alla fine devono collegarsi alle librerie installate nelle directory di sistema ( /usr/lib
, ecc.). Ma dal momento che i runtime di C / C ++ e le librerie di sistema cambiano frequentemente ABI, il tuo programma smette di funzionare quando aggiorni la tua distribuzione.
Ciò può anche essere causato, ad esempio, da un software con "backend" che alla fine si collega alle tue librerie di sistema. Un esempio è OpenGL, che a causa della varietà e della volatilità delle implementazioni, non può essere fornito dalle distribuzioni binarie. Devono semplicemente dipendere dall'implementazione OpenGL del sistema.
Ma se i tuoi link OpenGL di sistema contro libstdc++
, potresti potenzialmente essere morto nell'acqua. Quello che succede è che il vecchio eseguibile carica la sua copia locale di libstdc++
, e la libreria condivisa OpenGL carica la copia del sistema di libstdc++
. I due conflitti, e uno di loro si rifiuta di caricare, e di solito questo significa che OpenGL si rifiuta di funzionare e il programma si arresta in modo anomalo.
Per un "semplice" sviluppatore di applicazioni, è qualcosa come WinSxS realizzabile su Linux senza importanti modifiche architetturali al formato binario ELF e al kernel Linux ABI? O è qualcosa che dovrebbe essere incorporato nelle librerie di sistema in fase di compilazione e distribuito per un lungo periodo di tempo apportando modifiche a ELF, glibc, libstdc ++, compilatori e così via?