Linux:如何将版本信息嵌入共享库和二进制文件?

时间:2010-07-23 01:42:51

标签: linux gcc shared-libraries

在Linux上,有没有办法将版本信息嵌入到ELF二进制文件中?我想在编译时嵌入这些信息,以便以后可以使用脚本将其解压缩。一种hackish方式是植入可以使用strings命令提取的东西。是否有更传统的方法,类似于Visual Studio植入Windows DLL的版本信息(在DLL属性中注释版本选项卡)?

4 个答案:

答案 0 :(得分: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成为唯一选项以来,源代码控制已经有所改进,这意味着您可以找到更好的方法来实现相同的目标。

答案 1 :(得分: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在你对象的先决条件列表中列出了这个,那么构建将重新编译它所需要的东西。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

如果声明一个名为program_version或类似的变量,您可以找到该变量存储在哪个地址,然后继续提取其值。 E.g。

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

告诉我program_version位于地址0000000000600a24,大小为4.然后只需读取文件中该地址的值。

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