Compilation es principalmente una operación unidireccional, y no es determinista, al menos no de una manera sólida.
Usted podría recompilar el código fuente y ver si produce el mismo binario. Sin embargo, el binario exacto puede variar dependiendo de muchos parámetros, incluidas las opciones de compilación y la versión exacta del compilador utilizado. Además, algunos compiladores insertan algunos "comentarios" en archivos binarios, comentarios que generalmente incluyen la versión del compilador, pero también pueden incluir el "número de compilación" (si se mantiene dicho número) y, posiblemente, la fecha y hora de compilación, en eso caso, usted no obtendrá el mismo binario, no bajará hasta el último byte. Si desea ver si obtuvo el "mismo" binario, es posible que primero tenga que eliminarlos de dichos comentarios (el comando Unix strip
puede ser útil).
Estrictamente hablando, la compilación podría ser aleatoria; como generar un código óptimo es un problema difícil, algunos compiladores emplean algoritmos aleatorios que, heurísticamente , son buenos en promedio. Tal compilador podría generar un binario distinto cada vez. Dado que tal comportamiento hace que la depuración sea mucho más difícil, muchos compiladores que utilizan algoritmos heurísticos intentarán ser reproducibles (es decir, obtendrán su aleatoriedad de un PRNG sembrado con un valor específico y configurable).
Hay una solución mucho más simple: si tiene el código fuente y puede recompilarlo, entonces use la salida de su recompilación.
Por supuesto, esto no resuelve completamente el problema de la confianza; simplemente lo mueve alrededor Al compilar desde la fuente:
- debe confiar en que el código fuente no contiene puertas traseras;
- tienes que confiar en el compilador en sí mismo para no hacerte trucos desagradables.
Al menos, el código fuente es legible nominalmente por personas (ese es el punto del código fuente), por lo que puede realizar un análisis del código al leerlo (o hacer que lo lea un especialista en el que confíe). No se conoce ninguna forma de asegurarse de que un fragmento de código determinado no contenga ninguna puerta trasera o vulnerabilidad (de lo contrario, esto significaría que sabíamos cómo producir un código libre de errores); sin embargo, es mucho más difícil ocultar una puerta trasera en el código fuente que en un binario compilado.
En cuanto al compilador, vea este artículo muy clásico .