Los programadores integrados a menudo enfrentan la tarea de insertar una suma de verificación en binarios después de vincular. Un gestor de arranque puede verificar la suma de verificación antes de permitir una actualización de firmware o ejecutar el programa.
add_version_info es un pequeño script de Python que puede insertar información de control de versiones y suma de verificación en imágenes de firmware ELF o binarios.
La herramienta buscará dos marcadores de 16 bytes en la imagen del firmware y completará una estructura con el GIT actual o la ID de subversión, una suma de verificación e información de tiempo de compilación. La suma de verificación se forja, de modo que ejecutar una verificación CRC32 sobre toda la imagen generará la suma de verificación solicitada.
version.h #include <stdint.h>
#define VCS_INFO_START "VCSINFO2_START->"
#define VCS_INFO_END "<---VCSINFO2_END"
struct version_info {
char vcs_info_start [ 16 ];
// set by add-version-info.py
//
uint32_t image_crc ;
uint32_t image_start ;
uint32_t image_size ;
char vcs_id [ 32 ];
char build_user [ 16 ];
char build_host [ 16 ];
char build_date [ 16 ];
char build_time [ 16 ];
// set at compile-time
//
char product_name [ 32 ];
int major ;
int minor ;
int patch ;
char vcs_info_end [ 16 ];
};
extern volatile const struct version_info version_info ;
void print_version_info ( int verbose );version.c #include "version.h"
volatile const struct version_info version_info = {
. vcs_info_start = VCS_INFO_START ,
. product_name = "add_version_info example" ,
. major = 1 ,
. minor = 2 ,
. patch = 3 ,
. vcs_info_end = VCS_INFO_END
};
void print_version_info ( const struct version_info * v )
{
printf (
"%s v%d.%d.%d %s %s %sn"
" Compiled %s %s by %s on %sn"
v -> product_name ,
v -> major , v -> minor , v -> patch ,
v -> vcs_id ,
v -> build_date , v -> build_time ,
v -> build_date , v -> build_time ,
v -> build_user , v -> build_host
);
}
void main ( void )
{
print_version_info ( & version_info );
}Makefile # Link: create ELF output file from object files
#
$( TARGET ) .elf : $( OBJECTS )
@echo
@echo Linking: $@
$( CC ) $( OBJECTS ) $( LDFLAGS ) --output $( basename $@ ) .tmp
@echo
@echo Post-processing: $@
add-version-info.py -v $(basename $@).tmp $@