免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 11780 | 回复: 8

[SCO UNIX] 通过宏定义向二进制执行码写入编译信息 [复制链接]

论坛徽章:
0
发表于 2010-04-02 16:12 |显示全部楼层
本帖最后由 sunlan 于 2010-04-02 16:14 编辑

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

version.c

  1. #include <stdio.h>

  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 <stdio.h>

  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
复制代码
这个结果是我真正希望的!只要通过查看二进制执行码中的字符串,就可以确定程序的版本了!

论坛徽章:
0
发表于 2010-04-02 17:28 |显示全部楼层
版主的肯定是好东西,可惜曲高者和寡

论坛徽章:
0
发表于 2010-04-02 20:17 |显示全部楼层
搞SCO下开发的越来越少了吧,呵呵
SUN兄估计越来越难找到知己啦

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2010-04-03 09:02 |显示全部楼层
这帖子咋说也应该是精华吧。

学习了。

论坛徽章:
0
发表于 2010-04-20 04:20 |显示全部楼层
有一个问题一直憋了很久:buildtime部分为什么不用标准宏 __DATE__ 和 __TIME__ 呢?

论坛徽章:
0
发表于 2010-05-06 11:37 |显示全部楼层
回复 5# numdisp


    个人喜好。用外部传进去的更好控制输出格式

论坛徽章:
0
发表于 2010-05-11 16:57 |显示全部楼层
好帖要顶!!!

论坛徽章:
0
发表于 2010-06-17 13:15 |显示全部楼层
回复 6# sunlan


    我觉得也是啊,为什么不用系统宏__TIME__呢,你的编译时间只打印到某一日,远远不能满足要求啊

论坛徽章:
0
发表于 2010-06-25 16:30 |显示全部楼层
回复 8# fbi333444


    在维护上一般知道是哪天编译的程序就够了。而且还需要与源码管理软件配合使用,以便能定位修改的程序
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP