Publié initialement à : Cosmopolitan – Compiler un binaire unique multi-OS – Korben
Justine Tunney est une développeuse qui un jour, en étudiant du vieux code source, a découvert qu’il était possible d’encoder des fichiers Windows PE (Portable Executable) sous la forme de shell script unix. Cette magie s’opère grâce au fait que le shell Thompson n’utilise pas la ligne d’entête des script commençant par #!. On appelle ça aussi le shebang. « Sh » pour Sharp, à savoir le dièse, et le « bang » pour le point d’exclamation.
Justine a donc compris qu’il était possible de créer un format binaire global fonctionnant aussi bien sous Linux que macOS et Windows.
Pour aller plus loin dans sa découverte, elle a donc mis au point un projet de bibliothèque en C baptisé Cosmopolitan Libc qui permet de compiler du code dans un format exécutable fonctionnant sur tous les OS (Linux + Mac + Windows + FreeBSD + OpenBSD + NetBSD + BIOS) un peu comme ce qu’on pourrait faire avec du java, sauf que là, pas besoin d’interpréteur ou de machine virtuelle.
Voici un exemple de hello world compilé avec Cosmopolitan :
# Un petit hello world en C
printf %s '
main() {
printf("hello world\n");
}
' >hello.c
Une petite compilation avec gcc et les libs qui vont bien :
gcc -g -O -static -fno-pie -no-pie -mno-red-zone -nostdlib -nostdinc \
-o hello.com.dbg hello.c -Wl,--gc-sections -Wl,-z,max-page-size=0x1000 -fuse-ld=bfd \
-Wl,-T,ape.lds -include cosmopolitan.h crt.o ape.o cosmopolitan.a
objcopy -SO binary hello.com.dbg hello.com
Et voilà, un petit binaire multi OS ! C’est dingue !
Sur son site, elle propose ce binaire « hello world » qui effectivement fonctionne sans modification sous Mac et Windows et que vous pouvez tester vous-même. (rendez le exécutable avec un chmod +x avant)
Elle explique tout cela sur sa page web. Et la lib Cosmopolitan est sur Github. Maintenant vous saurez quoi proposer aux développeurs qui détestent ElectronJS ;-)))
Merci à Lolilol pour l’info !