Die Speicherung von CRC in eine AXF/ELF-Datei
Derzeit arbeite ich auf ein C-Programm in der LPCXpresso (eclipse-basiert) tool-Kette auf Windows 7, eine Entwicklungsumgebung mit gcc-targeting die einem NXP Cortex M3 Mikroprozessor. Es bietet eine einfache Möglichkeit, compile-link-Programm, das der Mikroprozessor über JTAG. Das Ergebnis eines build ist eine AXF Datei (ELF-format) geladen wird, durch die eine debug-Konfiguration.
Dem geladenen Programm befindet sich im Flash-Speicher von 0x00000 bis 0x3FFFB. Ich möchte einen 4-byte-CRC-32 bei 0x3FFFC zur Validierung des Programms beim start-up. Ich fügte hinzu, ein weiterer Abschnitt, und verwenden Sie die gcc __attribute__
Richtlinie für den Zugang zu diesem Speicher.
uint32_t crc32_build __attribute__ ((section(".text_MFlashCRC")));
Zu berechnen und zu speichern, die einen CRC-32 Wert, mein plan war zu verwenden SRecord mit dem folgenden post-build-Schritte:
arm-none-eabi-size "${BuildArtifactFileName}"
arm-none-eabi-objcopy -O binary "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin"
checksum -p ${TargetChip} -d "${BuildArtifactFileBaseName}.bin"
../util/srec_cat "${BuildArtifactFileBaseName}.bin" -binary -crop 0 0x3FFFC -fill 0xFF 0x00000 0x3FFFC -crc32-b-e 0x3FFFC -o "${BuildArtifactFileBaseName}.crc.bin" -binary
echo ""
echo "CRC32:"
../util/srec_cat "${BuildArtifactFileBaseName}.crc.bin" -binary -crop 0x3FFFC 0x40000 -o - -hex-dump
Dieser erzeugt eine Binärdatei mit einer Prüfsumme (notwendig für den bootloader) und berechnet dann die CRC über die verwendete Flash-Speicher, zum speichern des CRC-Wert an 0x3FFFC.
Aber ich glaube nicht, ich kann laden Sie die Binärdatei mit dem debugger. Es ist ein built-in-Programmierung utility mit LPCXpresso können, laden Sie die geänderte binäre Datei, aber das lässt mich nicht Debuggen. Ich glaube, ich kann dann versuchen, starten Sie eine debug-Sitzung mit dem original AXF-Datei mittels "attach-only" - Modus, allerdings wird dies umständlich.
Habe ich in der Lage zu verwenden readelf, um zu untersuchen crc32_build
variable in der AXF-Datei. Gibt es eine Möglichkeit zum Bearbeiten der variable in der AXF-Datei? Ist es ein Industrie-standard-Ansatz zum einfügen eines CRC als post-build-Schritt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine Industrie-standard, dass ich mir bewusst bin. Es gibt verschiedene Techniken, dies zu tun. Ich würde empfehlen, dass Sie die
crc32_build
alsextern
in 'C' und definieren es über ein linker-Skript. Zum Beispiel,Übergeben Sie den Wert
CALC_CRC
als null für einen ersten Aufruf und dann erneut verknüpfen, mit dem Wert. Zum Beispiel,Ich verwende diese Technik, um das hinzufügen digitaler Signaturen Bilder; es soll gleichermaßen für crc Werte. Die linker-Skript erlaubt Ihnen, die position der variable, die ist oft wichtig für die Integrität überprüft werden, wie ein CRC-Fehler, aber wichtig wäre nicht für eine einfache Prüfsumme. Ein linker-Skript erlaubt Ihnen auch, zu definieren, Symbole für Anfang und Ende der region. Ohne ein Skript, müssen Sie einige elf Introspektion.
Natürlich können Sie erweitern die Idee init-Daten und anderen zugewiesenen Abschnitte. Irgendwann müssen Sie
objcopy
zum extrahieren von Abschnitten und machen die Integritätsprüfung zur build-Zeit. Die Abschnitte können verschiedene alignment-Beschränkungen und Sie müssen imitieren diese (in unecht.bin oben) auf dem host, wenn dabei die build-Zeit crc Berechnung.Als bonus, alles ist schon getan, wenn Sie erzeugen ein srec - Datei.
Wenn Sie Probleme haben, mit
--defsym
Sie können nur vor der Verarbeitung der ld.Skript mit sed, awk, perl, python, etc, und ersetzen von text mit einem hex-Wert, wo CALC_CRC ist.ld
Befehl mit einem, der definiert, CALC_CRC?ld -r
(partielles linking) kann auch nützlich sein. Allerdings habe ich die oben genannte Methode, aber das Problem in meinem Fall war die Bestimmung der endgültigen Größe, wie dies im Zertifikat enthalten sind (eigentlich bekommen Sie das gleiche mit_end_crc_region-_start_crc_region
. Sie können subtrahieren der endgültigen crc-Größe bei der Berechnung der build-CRC; Ie, zählen Sie nicht die null in der dummy-Bild.__attribute section
für eine CRC - Eingang Abschnitte, aber ziemlich viel, müssen Sie eine benutzerdefinierte linker-Skript und setzen Sie die Eingänge in einigen output-Sektion ist (weil kein standard vorhanden ist). Also, die Methode wird Ihnen die gleiche end-Lösung (meiner Meinung nach) und man könnte definieren den Raum im linker-script. Der code muss wissen, die Größe (zusammengestellt in Bild); wenn Sie die CRC die CRC aufrufenden code. Alternativ können Sie die pad und einem vorher festgelegten maximalen Größe, sondern, dass Abfälle Laufzeit.objcopy -j .text -j .data
wird, kopieren Sie beide Teile. Aber der runtime-CRC wird zu springen Zeiger, so würde ich nur store zwei CRC-Werte und berechnen Sie separat. Ich glaube nicht, dass Sie viel zu gewinnen, indem Sie die beiden in einem Wert?const
ist ein 'C' zu konstruieren. Für den linker,.data
ist von "initdata", das ist die erste Daten-Werte. Dieser Abschnitt ist kopiert das endgültige.data
- Adresse beim Start. So, Ihr CRC der Daten, muss laufen, bevor sich etwas ändert jede 'C' - Globale/statische Daten, oder Sie können definieren einige spezielle.data
für bestimmte input-Dateien und nicht CRC-it. Asm oder C vorsichtig nur.