AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Die Delphi-IDE Warum ergibt zwei mal kompileren keine identischen .exe-Dateien?

Warum ergibt zwei mal kompileren keine identischen .exe-Dateien?

Offene Frage von "Delphi-Laie"
Ein Thema von Der schöne Günther · begonnen am 28. Jun 2017 · letzter Beitrag vom 2. Jul 2017
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.590 Beiträge
 
Delphi 12 Athens
 
#1

AW: Warum ergibt zwei mal kompileren keine identischen .exe-Dateien?

  Alt 28. Jun 2017, 21:19
Erstmal steht die CompileTime im PE-Header und die ist naturgemäß niemals gleich,
also egal was danach noch passiert, die Datei kann nie 100% identisch sein.

Eventuell arbeitet der Compiler auch nicht ganz statisch und optimiert manchmal so und manchmal so.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (28. Jun 2017 um 21:24 Uhr)
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#2

AW: Warum ergibt zwei mal kompileren keine identischen .exe-Dateien?

  Alt 28. Jun 2017, 21:28
Zitat:
Eventuell arbeitet der Compiler auch nicht ganz statisch und optimiert manchmal so und manchmal so.
Das kann durchaus sein denn ich hatte mit XE8 oder Tokyo, weiß nicht mehr welches, bereits das Problem, dass eine gewisse Funktion mal funktioniert hat und mal nicht.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.590 Beiträge
 
Delphi 12 Athens
 
#3

AW: Warum ergibt zwei mal kompileren keine identischen .exe-Dateien?

  Alt 28. Jun 2017, 21:37
Der Optimierer "sollte" aber nicht die Funktion verändern.
Also das Programm arbeitet eigentlich immer gleich, egal ob und wie optimiert wurde.

Außnahmen sind Sonderfälle, wo gewisse Eigenarten geziehlt ausgenutzt werden, wie z.B. absichtliche Integerüberläufe bei Hashfunktionen und Verschlüsselungen, welche dann abrauchen, wenn man die Bereichsprüfung aktiviert und bei dem Code das nicht beachtet wurde.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: Warum ergibt zwei mal kompileren keine identischen .exe-Dateien?

  Alt 28. Jun 2017, 23:06
Eventuell arbeitet der Compiler auch nicht ganz statisch und optimiert manchmal so und manchmal so.
Höchst unwahrscheinlich, dass der Compiler bei gleichem Quelltext nicht deterministisch auch den gleichen Code erzeugt.

Edit: Hast du mal die resultierenden Binaries statt der .map Dateien verglichen?
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (28. Jun 2017 um 23:10 Uhr)
  Mit Zitat antworten Zitat
Wosi

Registriert seit: 29. Aug 2007
59 Beiträge
 
#5

AW: Warum ergibt zwei mal kompileren keine identischen .exe-Dateien?

  Alt 29. Jun 2017, 00:12
Eventuell arbeitet der Compiler auch nicht ganz statisch und optimiert manchmal so und manchmal so.
Höchst unwahrscheinlich, dass der Compiler bei gleichem Quelltext nicht deterministisch auch den gleichen Code erzeugt.
Das wäre nicht das erste mal:

Zitat:
After some research I must say that the 10 Seattle’s Win64 compiler’s generated code isn’t deterministic anymore (same input doesn’t generate the same output). It’s like the compiler uses the Random function to allocate CPU registers, so it could be an uninitialized variable somewhere in the compiler. The Win32 compiler and the XE8 and older Win64 compilers aren’t affected by this. So this is a regression bug for 10 Seattle.
http://andy.jgknet.de/blog/2015/10/i...-the-compiler/
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Warum ergibt zwei mal kompileren keine identischen .exe-Dateien?

  Alt 29. Jun 2017, 01:08
Könnte durchaus sein, dass für so Probleme wie Registerallokation stochastische Algorithmen eingesetzt werden. Ist aber schon blöd, dass nicht jedes mal der gleiche RandSeed verwendet wird.

Eine weitere Ursache, die ich mir vorstellen könnte, wäre Parallelisierung (eventuell werden unabhängige Teile des Codes parallel kompiliert und je nachdem welcher Thread zuerst fertig wird, landet mal der eine oder der andere Teil früher in der Exe).
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Warum ergibt zwei mal kompileren keine identischen .exe-Dateien?

  Alt 29. Jun 2017, 07:19
Hallo,
da es hier um eine Win32-Anwendung handelt, ist die Aussage zum 64-Bit-Compiler ohne Wert (?).

Ich habe folgende Vermutung:
Die Adressen sind relativ zu einer Startadresse.
Diese Startadresse wird wohl vom Compiler per Zufall gewählt,
um zu verhindern, dass sich Trojaner und andere freche Gesellen daran orientieren.

Oder verwechsel ich das mit Windows selber?
Heiko
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.216 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Warum ergibt zwei mal kompileren keine identischen .exe-Dateien?

  Alt 29. Jun 2017, 07:42
Im Endeffekt interessieren mich ja mehr die Adressen (also map-Datei) als die exe selbst.

Grund: Ich hinterfragte den Aufrufstack von einem Crashlog beim Kunden. Die Vermutung war dass bei Release die falsche Map-Datei (.jdbg) beigelegt wurde und der Aufrufstack falsch ist. Ich wollte genau diese Version noch einmal neu builden und die enstandene Map-Datei vergleichen.

Sie sind völlig unterschiedlich. Das sagt aber leider nichts aus da die Map-Dateien anscheinend immer unterschiedlich sind. Doof.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.590 Beiträge
 
Delphi 12 Athens
 
#9

AW: Warum ergibt zwei mal kompileren keine identischen .exe-Dateien?

  Alt 29. Jun 2017, 07:56
Die Startadresse ($Imagebase $00400000) ist eigentlisch statisch, da sie selten von den Entwicklern verändert wird.

Ob dann Windows zur Laufzeit alles reallociert, ist 'ne andere Geschichte.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
678 Beiträge
 
FreePascal / Lazarus
 
#10

AW: Warum ergibt zwei mal kompileren keine identischen .exe-Dateien?

  Alt 29. Jun 2017, 14:22
Schaut euch doch mal die Screenshots an, statt zu spekulieren

Es geht nicht um den Timestamp im PE-Header (und selbst der war jahrelang statisch). Auch ASLR ist Betriebssystemsache und keine Aufgabe des Compilers. Und unterschiedliche Teile, die zuerst in der .exe landen, passen da genau so wenig zu. Parallelisierung müsste mehrere Threads für einzelne Methoden bedeuten, was ich mir nicht als effektiv vorstellen kann.

Es geht scheinbar in allen Fällen (in den Screenshots) um lediglich vier Byte, und zwischendurch pendeln die auch wieder zurück.
Zugegeben verwirrt Günther da mit "Sie sind völlig unterschiedlich" selber, denn "völlig" ist das wahrlich nicht

Ne Antwort habe ich auch nicht, da mein letztes Delphi XE (ja, noch ohne Zahl) war. Ist doch aber nicht soo schwer... zwei unterschiedliche Dateien nehmen, und zwei Funktionen am Wechsel zwischen Gleichlauf und Versatz disassemblieren und vergleichen, inwieweit die identisch sind, ob da ggfls. ein nop-Padding dazwischen ist... dann hätte der Compiler einfach Probleme mit dem Alignment.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz