Les programmeurs intégrés sont souvent confrontés à la tâche pour insérer une somme de contrôle en binaires après lien. Un chargeur de démarrage peut ensuite vérifier la somme de contrôle avant d'autoriser une mise à jour du micrologiciel ou d'exécuter le programme.
add_version_info est un petit script python qui peut insérer des informations de contrôle de version et des sommes de contrôle dans des images de micrologiciel ELF ou binaires.
L'outil recherchera deux marqueurs de 16 octets dans l'image du firmware et remplira une structure avec l'ID GIT ou Subversion actuel, une somme de contrôle et des informations de temps de création. La somme de contrôle est forgée, de sorte que l'exécution d'une vérification CRC32 sur l'image entière donnera la somme de contrôle demandée.
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 $@