26 votes

La compilation d'un programme deux fois produit-elle un binaire identique bit à bit ?

Si je devais compiler un programme en un seul binaire, faire une somme de contrôle, puis le recompiler sur la même machine avec le même compilateur et les mêmes paramètres de compilation et faire une somme de contrôle du programme recompilé, la somme de contrôle échouerait-elle ?

Si oui, pourquoi ? Si ce n'est pas le cas, le fait d'avoir une unité centrale différente donnerait-il lieu à un binaire non identique ?

8 votes

Cela dépend du compilateur. Certains d'entre eux intègrent des horodateurs, la réponse est donc "non" pour ceux-là.

0 votes

En fait, cela dépend de la format exécutable et non le compilateur. Certains formats d'exécutables, comme le format PE de Windows, incluent un horodatage qui est lié à l'heure et à la date de compilation, tandis que d'autres formats, comme le format ELF de Linux, ne le font pas. Quoi qu'il en soit, cette question dépend de la définition de "binaire identique". L'image elle-même sera/devrait être identique sur le plan binaire si le même fichier source est compilé avec le même compilateur, les mêmes bibliothèques, les mêmes commutateurs et tout le reste, mais l'en-tête et les autres métadonnées peuvent varier.

2voto

Kamil Drakari Points 7059

Le projet https://reproducible-builds.org/ s'intéresse à cette question et s'efforce de répondre à votre question "non, ils ne seront pas différents" dans le plus grand nombre d'endroits possible. NixOS et Debian ont maintenant plus de 90 % de reproductibilité pour leurs paquets.

Si vous compilez un binaire et que je compile un binaire, et qu'ils sont identiques bit à bit, je peux être rassuré sur le fait que le code source et les outils déterminent le résultat, et que vous n'avez pas introduit un code trojan en cours de route.

Si nous combinons la reproductibilité avec l'amorçabilité à partir d'une source lisible par l'homme, comme http://bootstrappable.org/ s'efforce de faire, nous obtenons un système déterminé de A à Z par une source lisible par l'homme, et c'est seulement à ce moment-là que nous pouvons être sûrs de savoir ce que fait le système.

1voto

Daniel R Hicks Points 6107

En général, non. La plupart des compilateurs raisonnablement sophistiqués incluent le temps de compilation dans le module objet. Même si vous deviez remettre l'horloge à zéro, il vous faudrait être très précis quant au moment où vous avez lancé la compilation (et espérer ensuite que les accès au disque, etc. soient à la même vitesse qu'avant).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X