我怎么能查询二进制的源代码版本

时间:2012-03-15 04:04:04

标签: c++ c linux version-control

我的环境是Linux CentOS 6.2。我有一个像svn / hg / git等源代码控制系统。我的源代码是C / C ++。

我想检查构建二进制文件以确保将哪个二进制文件发布给客户。

我认为当源代码发生变化时,构建二进制文件的校验和会有所不同。 所以,我可以反向跟踪从哪个版本构建二进制文件。

有可能,我必须遵循什么样的技巧?

我看到一些可执行文件在使用-version选项执行时会显示修订版本。 但我想知道如何防止将错误的-version字符串写入可执行文件。

如果我保留md5.txt并签入它而不是检入二进制文件。 我怎样才能确保我可以再次构建相同的md5可执行文件?

很抱歉,为了清除我的问题并阻止其他意外答案,我更喜欢这样的答案:

  1. 向用户发布新版本时,在scm中保留md5sum.txt。
  2. 将二进制文件与SCM分开。
  3. 要重建相同的md5sum二进制文件,您应该确保
    • make时将符号写入二进制(例如-DVERSION =“1.x”)
    • 向用户显示VERSION字符串
    • 删除所有$ Id,这会让您的SCM运行得更慢。
    • 保持相同的CPU& OS&编译器&图书馆环境
    • ...

3 个答案:

答案 0 :(得分:2)

  1. 在.cpp文件中创建字符串,如下所示:

    static const char version[] = "@(#) $Id$";

    其中$ Id $来自SVN

  2. 使用 what 命令(参见手册页)。它将从二进制文件中获取这些字符串,以便您检查。

答案 1 :(得分:0)

这是可执行文件还是共享库?如果是后者,您可以导出一个返回版本的函数(数字,字符串,您的选择)。然后dlopen(),dlsym(),并执行该函数。

对于可执行的ELF二进制文件,您可以在二进制文件中植入一些可以使用'nm'实用程序查询的数据。

答案 2 :(得分:0)

如果您将使用Subversion,SvnRev将为您完成大部分工作(repos中没有md5,repo hold sources,binary-resource with revision-id)

对于Mercurial,您可以从VersioningWithMake wiki获取版本sting的想法,并且为了获得类似git describe的结果的字符串,而不是HGVERSION的简单模板{node | short},您可以使用{{ {1}},显示(示例){latesttag}+{latesttagdistance}:{node|short}