La recompilation d'un programme produit-elle un binaire identique bit à bit ?
Pour tous les compilateurs ? Non. Le compilateur C#, au moins, n'est pas autorisé à le faire.
Eric Lippert a un exposé très complet sur les raisons pour lesquelles la sortie du compilateur n'est pas déterministe .
[Par conception, le compilateur C# ne produit jamais deux fois le même binaire. Le compilateur C# incorpore un GUID fraîchement généré dans chaque assemblage, à chaque fois que vous l'exécutez, garantissant ainsi que deux assemblages ne sont jamais identiques bit à bit. Pour citer la spécification du CLI :
La colonne Mvid doit indexer un GUID unique [...] qui identifie cette instance du module. [Le Mvid doit être généré à nouveau pour chaque module [...] Bien que le [runtime] lui-même n'utilise pas le Mvid, d'autres outils (comme les débogueurs [...]) s'appuient sur le fait que le Mvid diffère presque toujours d'un module à l'autre.
Bien qu'il soit spécifique à une version du compilateur C#, de nombreux points de l'article peuvent être appliqués à l'ensemble de l'Europe. tout compilateur.
Tout d'abord, nous supposons que nous obtenons toujours la même liste de fichiers à chaque fois, dans le même ordre. Mais dans certains cas, cela dépend du système d'exploitation. Lorsque vous dites "csc *.cs", l'ordre dans lequel le système d'exploitation propose la liste des fichiers correspondants est un détail d'implémentation du système d'exploitation ; le compilateur ne trie pas cette liste dans un ordre canonique.
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.