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

转自: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

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

posted on 2010-12-02 08:34  SunBo 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/sunyubo/archive/2010/12/02/2282090.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值