Je suis abonné à The Daily WTF (“What The Fuck?” étant une expression d’interrogation et de surprise ébahie devant un problème contrariant), site répertoriant périodiquement un grand nombre d’abominations informatiques rencontrées dans la vie réelle, des messages d’erreur absconts et amusants aux tragiques sites bancaires développés par des débutants autodidactes qui réinventent la roue, mais carrée.
Une livraison de février attirait l’attention sur un script de Solaris (/bin/true
), dont la seule utilité est de renvoyer la valeur vraie pour indiquer qu’il s’est exécuté correctement. Il y a aussi un /bin/false
. Laissons de côté l’hypothétique utilité (je suis preneur d’exemples pour ma culture). Le commentateur avait été horrifié par le copyright
, et le numéro de version 1.6 (!). Le fichier faisait plus de 300 octets de commentaires (aucun code exécutable, la fin du fichier menant à une sortie avec un code de succès).
Et sous mes OS favoris ?
- Sur Mac OS :
$ ll /usr/bin/true
-r-xr-xr-x 1 root wheel 13580 Mar 21 2005 /usr/bin/true
$ file /usr/bin/true
/usr/bin/true: Mach-O executable ppc
(oui, j’ai un vieux Mac).
- Sous Linux Debian Etch :
$ ll /bin/true
-rwxr-xr-x 1 root root 11680 2007-01-30 19:51 /bin/true
Soit de 11 à 13 ko pour... rien ! Ou plutôt, juste une valeur true, soit un bit d’information. Il a existé des ordinateurs qui avec beaucoup moins de kilooctets de mémoire ont calculé des choses bien plus complexes (genre tables balistiques ou calculs scientifiques pour concevoir une bombe A ou H, ou quoi que ce soit qu’un ordinateur devait faire en 1945).
Dans les deux cas, on n’a pas de script comme l’exemple du WTF sous Solaris, mais des exécutables complets. Que contiennent-ils ? Je n’ai pas pris la peine de charger le code source mais j’ai juste fait un strings
sur la version Linux à la recherche des chaînes incluses, et au milieu d’un kilooctet et demi de texte je trouve :
Jim Meyering
5.97
GNU coreutils
write error
Written by %s.
Written by %s and %s.
Written by %s, %s, and %s.
This is free software. You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
There is NO WARRANTY, to the extent permitted by law.
Enfoncé, Solaris et sa version 1.6 ! GNU est déjà à la 5.97.
Bon, je veux bien que true
ne soit que l’un des nombreux utilitaires de coreutils
, d’où le numéro, et que par défaut n’importe quel exécutable doit chez GNU répondre à divers critères, dont répondre aux paramètres --help
et --version
, et que de toute façon tout cela n’a aucune importance vu que le moindre shell (même dash) possède en réalité la commande true
en interne, qui ne renvoie rien (et donc cet exécutable est en plus inutile en plus d’être boursouflé !).
Si un bit occupe 11 à 13 ko sur tous les Unix du monde, quel est l’ordre de grandeur du gaspillage de l’informatique au niveau mondial ? Quiconque a utilisé Vista, BO XI... sait que les marges de progression sont encore énormes, même si la loi de Moore devenait caduque demain.
16 réactions
1 De Balise - 13/04/2008, 23:31
L'utilité pratique de /bin/true, là tout de suite, j'ai pas.
L'utilité pratique de /bin/false : c'est bien pour les comptes de la babasse qui ont pas de shell, cf /etc/passwd.
2 De giz404 - 14/04/2008, 09:11
Ce qui fait peur, c'est de se dire qu'un bout de code qui ne fait quasiment rien pèse 11ko... Qu'y a-t-il dans du code qui fait quelque chose ???
Dans le genre programme qui ne fait rien, il y a aussi Nada, bien plus optimisé, lui ;-)
www.bernardbelanger.com/c...
3 De Thias - 14/04/2008, 09:19
/bin/true est très pratique si on a un programme qui en exécute d'autres, on peut lui passer /bin/true comme paramètre pour une commande qui fonctionne toujours. Idem pour false. L'existence de ces deux commandes est déjà justifiée comme outils de test.
4 De miod - 14/04/2008, 09:50
Balise : une utilité de true est de permettre d'ignorer une valeur de retour non nulle d'une commande précédente dans un Makefile, avec des constructions du type ``commande_qui_peut_echouer || true''
5 De Steve Schnepp - 14/04/2008, 13:54
@Balise:
Et comment ferais-tu le fameux "while /bin/true" sinon ?
6 De Le webmestre - 14/04/2008, 19:43
@Steve : while [ 1 = 1 ] ... semble fonctionner.
7 De Le webmestre - 14/04/2008, 19:46
@giz404 : Dans un sens ça me rappelle ce compresseur de fichiers qui zippait tout à un octet... et planquait tout dans un répertoire temporaire pour la « décompression ».
8 De miod - 15/04/2008, 08:42
Pour le while, un simple "while : ; do ... done" fera parfaitement l'affaire.
9 De Steph - 15/04/2008, 09:28
Le source:
www.opensource.apple.com/...
#include <stdlib.h>
int main () { exit(0); }
Sur 10.5.2: 37KB^H^HKo (en universal, et le code est signé). J'imagine que le certificat prend 80% de la place.
10 De Le webmestre - 15/04/2008, 11:14
@Steph :
Heu... Il sert à quelque chose l'include (mes souvenirs de C sont lointains) ? Parce que mine de rien ça rallonge sensiblement le code source, même si le compilateur doit tout retailler derrière.11 De Thias - 15/04/2008, 17:32
J'ai une entrée de blog sur ce sujet thias.absyrde.net/wordpre... malheureusement le trackback est désactivé.
12 De Le webmestre - 15/04/2008, 19:21
@Thias : Merci pour l’analyse. J’apprends des choses dans un coin trop bas niveau de l’informatique pour qu’il me serve à court terme...
Par contre, la morale est claire : à cause de tous les « entêtes », l’optimisation des exécutables actuels n’est pas faite pour les cas dégénérés comme celui-ci. Si je regarde les autres exécutables dans /usr/bin sur le Mac, true est le plus petit des exécutables, mais hdid par exemple, beaucoup plus complexe (du moins en apparence), est plus gros de seulement 64 octets !
(J’ai désactivé les trackbacks pour cause de spam inefficacement filtré... Après tout les commentaires fonctionnent aussi bien.)
13 De vpo - 21/04/2008, 22:46
@Christophe: Si c'est si gros, c'est peut être par ce que:
1/ C'est tout compilé en mode debug. Alors avec tous les symboles pour le debugger, ça rajoute...
2/ Le linker utilisé par gcc va tout linker même le code pas appelée par défaut dans un fichier C, voire une lib entière. Il y a une option pour lui dire de striper fonction par fonction.
14 De Thias - 03/05/2008, 22:24
L'optimisation des binaires est faite pour minimiser le temps de chargement, et faciliter la pagination en mémoire virtuelle. Les pages de code qui virées de la mémoire vive n'ont pas besoin d'être écrite sur le fichier swap, vu qu'elle correspondent à une zone dans un fichier alignée sur une limite de page. Vu que la taille d'un bloc d'allocation sur le système de fichier est de 4K, optimiser là taille en dessous est un exercice purement académique.
J'ai fait une nouvelle entrée dans mon blog ou j'explique comme j'ai ramené un binaire Darwin de hello-world à 4K (en partant de plus de 12K). thias.absyrde.net/wordpre...
15 De Le webmestre - 03/05/2008, 22:43
@Thias : C’est un niveau de magie trop évolué pour moi mais c’est fascinant. Mes questions sont sous ton billet.
16 De Thias - 07/05/2008, 03:02
Bon, je suis arrivé à une version à 444 bytes: thias.absyrde.net/wordpre...