2010-07-23 79 views
7

在Linux上,是否有将版本信息嵌入到ELF二进制文件的方法?我想在编译时嵌入此信息,以便稍后使用脚本将其解压缩。一种骇人的方法是种植一些可以使用命令strings提取的东西。是否有更传统的方法,类似于Visual Studio为Windows DLL提供版本信息(注意DLL属性中的版本选项卡)?Linux:如何将版本信息嵌入共享库和二进制文件?

+0

[文件版本信息]的可能的重复(http://stackoverflow.com/questions/2296101/file-version-information) – 2010-07-23 01:45:59

回答

9

使用cvs或subversion的一种方法是在源文件中特别格式化一个特殊的id字符串。然后在cvs或svn中添加一个预先提交的钩子,用于在提交更改时使用该文件的新版本更新该特殊变量。然后,在构建二进制文件时,可以使用ident来提取该信息。例如:

添加这样的事情您的CPP文件:

static char fileid[] = "$Id: fname.cc,v 1.124 2010/07/21 06:38:45 author Exp $"; 

和运行的ident上的程序(您可以通过安装RCS找到)应显示大约有一个ID字符串的文件的信息在他们中。

ident program 
program: 
    $Id: fname.cc,v 1.124 2010/07/21 06:38:45 author Exp $ 

注意随着人们在评论中所提到的这种技术是过时了。让源代码管理系统自动更改源代码很丑陋,而源代码控制自CVS成为唯一选项的日子以来得到了改进,这意味着您可以找到更好的方法来实现相同的目标。

+0

+1:我从来没有遇到过身份证,最有用的。 – 2010-07-23 01:56:36

+2

'ident'曾经非常有用,但是在分布式版本控制系统中嵌入'$ Id $'字符串变得不明智。它混淆了差异和合并。 – cdunn2001 2012-06-18 19:53:21

1

英特尔Fortran和C++编译器当然可以做到这一点,请使用-sox选项。所以,是的,有一种方法。我不知道在二进制文件中嵌入这样的信息有什么广泛的惯例,我通常在hexl模式下使用Emacs来读取嵌入的信息,这是非常危险的。

'-sox'也嵌入用于构建可执行文件的编译器选项,这非常有用。

1

如果声明一个名为program_version或者类似的变量,你可以找出变量存储在哪个地址,然后继续提取它的值。例如。

objdump -t --demangle /tmp/libtest.so | grep program_version 
0000000000600a24 g  O .data 0000000000000004    program_version 

告诉我,program_version驻留在地址0000000000600a24,是大小4.然后,只需在文件中读取该地址的值。

或者您可以编写一个简单的程序来链接库中的问题并打印版本,该版本定义为导出的变量或函数。

3

为了延长@sashang答案,同时也避免了“$ ID:$”由@ cdunn2001,...

提到的问题,您可以添加文件“version_info.h”到您的项目只有是:

#define VERSION_MAJOR "1" 
#define VERSION_MINOR "0" 
#define VERSION_PATCH "0" 
#define VERSION_BUILD "0" 

而在你的main.c文件中有一行:

static char version[] = VERSION_MAJOR "." VERSION_MINOR "." VERSION_PATCH "." VERSION_BUILD; 
static char timestamp[] = __DATE__ " " __TIME__; 

(或无论你想在程序中使用这些值)

然后设置一个预生成步骤,读取version_info.h文件,适当地颠倒数字,然后再将其写回。每日构建只会影响VERSION_BUILD数字,而更严重的版本会影响其他数字。

如果你的makefile在你的对象的先决条件列表中列出了这个,那么构建将重新编译它需要的东西。

相关问题