在Linux上,是否有将版本信息embedded到ELF二进制文件的方法? 我想在编译时embedded这个信息,以便稍后可以使用脚本来提取它。 一个骇客的方法是种植一些可以使用strings
命令提取的东西。 有没有一个更传统的方法,类似于Visual Studio植物版本信息的Windows DLL(注意DLL属性中的版本选项卡)?
如果使用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成为唯一选择的日子以来得到了改进,这意味着你可以找到一个更好的方法来实现相同的目标。
要扩大@sashang答案,同时避免@ cdunn2001提到的“$ Id:$”问题,…
您可以将文件“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在你的对象的先决条件列表中列出了这个,那么构建将重新编译它所需要的。
如果你声明了一个名为program_version
或类似的变量,你可以找出变量存储在哪个地址,然后继续提取它的值。 例如
objdump -t --demangle /tmp/libtest.so | grep program_version 0000000000600a24 g O .data 0000000000000004 program_version
告诉我, program_version
驻留在地址0000000000600a24
,大小为4,然后只读取文件中该地址的值。
或者你可以编写一个简单的程序来链接库中的问题,并打印版本,定义为导出的变量或函数。
英特尔Fortran和C ++编译器当然可以做到这一点,使用-sox
选项。 所以,是的,有一个方法。 我不知道在二进制文件中嵌入这样的信息有什么广泛的惯例,我通常使用Emacs在hexl模式下读取嵌入的信息,这是相当ha </s>的。
'-sox'也嵌入了用于构建可执行文件的编译器选项,这非常有用。