add version info
1.0.0
嵌入式程序員經常在鏈接後面臨將校驗和插入二進製文件的任務。然後,引導加載程序可以在允許固件更新或運行程序之前驗證校驗和。
add_version_info是一個小型Python腳本,可以將版本控制信息和校驗和校驗和校驗插入精靈或二進制固件圖像中。
該工具將在固件圖像中搜索兩個16個字節標記,並使用當前的git或subversion ID,校驗和構建時間信息填充結構。校驗和鍛造,因此在整個圖像上運行CRC32檢查將產生所需的校驗和。
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 $@