Forum: Compiler & IDEs Finde den Code zum Kompilat


von Lukas S. (lukker)


Lesenswert?

Ich habe hier den Inhalt des Flahsspeichers aus einen STM32 und ein 
Git-Repository mit mehreren Versionsständen des Codes. Ich soll nun 
herausfinden, welcher Versionsstand genau den vorhandenen Flashinhalt 
ergeben hat.
Beim Kompilieren erhalte ich eine Datei.elf, das Speicherabbild trägt 
die Erweiterung.bin. Es ist exakt zwei Megabyte groß, genau so groß wie 
der Flash des STM32. Ein direkter Vergleich mit der Datei.elf ist gar 
nicht nötig, da sie nur wenige Kilobyte groß und damit sicher 
verschieden ist.

Ich habe mit dem objcopy.exe aus einem Unterverzeichnis des STM32CubeIDE 
aus der Datei.elf eine Datei.bin gemacht um sie mit dem Flashinhalt 
vergleichen zu können, sie ist aber nicht zwei Megabyte groß.

Gibt es eine Möglichkeit, die kompilierte .elf so mit dem .bin zu 
vergleichen, dass Equivalenz festgestellt werden kann (oder .hex oder 
wasauchimmer mit den beiden vorhandenen Dateien möglich ist)?

von Nemopuk (nemopuk)


Lesenswert?

Vermutlich wurde das bin File nicht erzeugt, sonder aus gelesen. Es ist 
größer, als das Programm. Ein direkter 1:1 Vergleich wird nicht gehen.

Ich würde versuchen, nur die ersten n Bytes zu vergleichen, entsprechend 
der kleineren bin Datei.

von Rüdiger B. (rbruns)


Lesenswert?

Im bin sollte doch eine Versionsnummer zu finden sein, wird doch als 
Info im Programm angezigt oder ?

von G. K. (zumsel)


Lesenswert?

Lukas S. schrieb:

> Gibt es eine Möglichkeit, die kompilierte .elf so mit dem .bin zu
> vergleichen, dass Equivalenz festgestellt werden kann (oder .hex oder
> wasauchimmer mit den beiden vorhandenen Dateien möglich ist)?

Möglicherweise wird ein einfacher Vergleich nicht reichen:

https://www.google.com/search?q=reproducible+builds

von Oliver S. (oliverso)


Lesenswert?

Du brauchst die toolchain-Version, die für die Erzeugung des 
Flashinhalts benutzt wurde, dazu die verwendeten Optionen. Das kann 
kompliziert werden.

Wie schon gesagt wurde, wenns da irgendwelche Strings gibt, die die 
Version identifizieren, kanst du mit einem hex-Editor danach suchen.

Oliver

von Harald K. (kirnbichler)


Lesenswert?

Rüdiger B. schrieb:
> Im bin sollte doch eine Versionsnummer zu finden sein

Das setzt voraus, daß derjenige, der die Compilate erzeugte, über soviel 
Selbstdisziplin verfügte, diese für jeden Durchlauf hochzusetzen.

Ich habe mir angewöhnt, im lokalen Git auch die erzeugen Binaries als 
Assets zu speichern. Die nehmen zwar mehr Platz weg als der reine 
Sourcecode, sind aber an anderer Stelle ungemein praktisch.

von G. K. (zumsel)


Lesenswert?

Harald K. schrieb:

> Das setzt voraus, daß derjenige, der die Compilate erzeugte, über soviel
> Selbstdisziplin verfügte, diese für jeden Durchlauf hochzusetzen.

Das kann man automatisieren.

von Alexander (alecxs)


Lesenswert?

Man könnte es durch Ghidra jagen und anschließend durch eine KI.

Lukas S. schrieb:
> Ich habe hier den Inhalt des Flahsspeichers aus einen STM32 und ein
> Git-Repository mit mehreren Versionsständen des Codes.

Wieviele Kandidaten kommen in Frage?

Lukas S. schrieb:
> Ich soll nun herausfinden, welcher Versionsstand genau den vorhandenen
> Flashinhalt ergeben hat.

Wie wichtig ist das, wirst Du extra dafür bezahlt, hast Du ein paar 
Wochen Zeit?

von Harald K. (kirnbichler)


Lesenswert?

G. K. schrieb:
> Das kann man automatisieren.

Auch das erfordert die nötige Disziplin, es zu tun. Wenn man eh' so 
arbeitet, ist das kein Problem, aber eben nicht jeder arbeitet so.

Wieviele Projekte mir schon über den Weg gelaufen sind, in denen die 
Versionskennung einfach ein #define mit einem String waren, in dem dann 
auch irgendein Datum stand ...

Strukturiert arbeiten geht anders.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.