通过宏定义向二进制执行码写入编译信息

转自:http://bbs.chinaunix.net/thread-1685440-1-1.html

很多程序员都遇到过这样的问题:已经上线运行很长时间的系统出了问题,并且其中的很多程序经过了多次的修改和升级,日志中的信息和现有的程序完全对不上号!怎样才能查看程序的信息(例如版本号、编译的时间等)、以确定程序的确切版本呢?很多的版本管理工具(例如CVS、SVN)可以帮你管理源码的版本,但并不会在编译的时候把编译信息写到二进制执行码中去。因此,还是要通过其他手段来实现。
在这里我提供了一种在可执行程序中写入编译信息的办法,希望对大家有帮助。
这个例子由两个程序构成:test.c、version.c。其中version.c用于实现编译信息的记录,只要在现有的代码中加入该程序,而不需要对已有代码作任何的修改,就能实现二进制执行码的版本信息管理。
version.c

  1. #include
  2. /* 以下两个宏用于在编译时通过宏定义传入编译信息
  3. VERSION被替换为const char version[]=”Resivion: xxxx”
  4. BUILDTIME被替换为 const char buildtime[]=”Buildtime: yyyymmdd”
  5. */
  6. VERSION;
  7. BUILDTIME;
  8. void print_version()
  9. {
  10. printf( “%s\n”, version );
  11. }
  12. void print_buildtime()
  13. {
  14. printf( “%s\n”, buildtime );
  15. }

print_version()和print_buildtime()这两个函数不是必须的,只是让version.c看起来“更象个程序”,同时可以提供在外部程序中输出编译信息的手段。
test.c

  1. #include
  2. int main()
  3. {
  4. print_version();
  5. print_buildtime();
  6. }

在test.c中调用这两个函数只是用于测试,正式版本的程序中可以用实际的代码替换。
在Makefile中添加以下的内容:

  1. version="const char version[]=\"Revision: 1.2.2\""
  2. buildtime="const char buildtime[]=\"Buildtime: `date +%Y%m%d`\""
  3. CFLAGS=-c –g –DVERSION=”$version” –DBUILDTIME=”$buildtime”
  4. testversion: test.o version.o
  5. cc –o $@ $?
  6. .c.o :
  7. $(CC) $(CFLAGS) $<

如果你使用了版本管理工具,可以通过工具动态读取版本(或修订)信息,将信息赋值给version变量。你完全可以自己定义宏定义的格式,例如将编译的精确时间写进去。
编译后执行:

  1. $testversion
  2. Revision: 1.2.2
  3. Buildtime: 20100402
  4. $

通过strings命令查看:

  1. $string testversion | grep Revision
  2. Revision: 1.2.2
  3. $strings testversion | grep Buildtime
  4. Buildtime: 20100402

这个结果是我真正希望的!只要通过查看二进制执行码中的字符串,就可以确定程序的版本了!

你可能感兴趣的:(C++,c,SVN,C#,cvs)