在Linux上,是否有将版本信息嵌入到ELF二进制文件的方法?我想在编译时嵌入此信息,以便稍后使用脚本将其解压缩。一种骇人的方法是种植一些可以使用命令strings
提取的东西。是否有更传统的方法,类似于Visual Studio为Windows DLL提供版本信息(注意DLL属性中的版本选项卡)?Linux:如何将版本信息嵌入共享库和二进制文件?
回答
使用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:我从来没有遇到过身份证,最有用的。 – 2010-07-23 01:56:36
'ident'曾经非常有用,但是在分布式版本控制系统中嵌入'$ Id $'字符串变得不明智。它混淆了差异和合并。 – cdunn2001 2012-06-18 19:53:21
英特尔Fortran和C++编译器当然可以做到这一点,请使用-sox
选项。所以,是的,有一种方法。我不知道在二进制文件中嵌入这样的信息有什么广泛的惯例,我通常在hexl模式下使用Emacs来读取嵌入的信息,这是非常危险的。
'-sox'也嵌入用于构建可执行文件的编译器选项,这非常有用。
如果声明一个名为program_version
或者类似的变量,你可以找出变量存储在哪个地址,然后继续提取它的值。例如。
objdump -t --demangle /tmp/libtest.so | grep program_version
0000000000600a24 g O .data 0000000000000004 program_version
告诉我,program_version
驻留在地址0000000000600a24
,是大小4.然后,只需在文件中读取该地址的值。
或者您可以编写一个简单的程序来链接库中的问题并打印版本,该版本定义为导出的变量或函数。
为了延长@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在你的对象的先决条件列表中列出了这个,那么构建将重新编译它需要的东西。
- 1. 如何将版本信息嵌入到Windows二进制文件中?
- 2. 要嵌入到Linux共享库中的信息
- 3. 在构建的二进制文件中更改版本信息
- 4. 在iPhone和iPad之间共享NSUserDefaults通用二进制文件版本
- 5. 同一个Linux发行版的不同版本之间的二进制和共享库兼容性
- 6. 如何检索二进制文件的二进制版本号
- 7. 获取二进制文件和文本信息
- 8. 在.Net中读取文本和二进制信息的文件
- 9. 编译后的Linux共享库(.so文件)版本
- 10. 版本控制共享文件夹
- 11. Capistrano:共享文件的版本控制/
- 12. 如何嵌入版本信息使用mercurial和maven(和svn)
- 13. 如何将共享库与其他共享库链接到Linux?
- 14. 由于缺少共享库,二进制文件拒绝运行
- 15. 共享库:没有可用的版本信息
- 16. 拥有版本信息的CMAKE链接共享库
- 17. 更新二进制文件信息
- 18. 涉及二进制和文本文件时的版本控制?
- 19. 如何将字符串嵌入到二进制文件中?
- 20. 共享信息
- 21. Linux共享库
- 22. go针对不同的共享库构建多个二进制版本
- 23. Py2app问题:python二进制文件根本没有共享库(或框架)
- 24. 如何从二进制文件发送信息到屏幕和外部文件?
- 25. 数据库共享/版本
- 26. 二进制文件中的GCC版本
- 27. 我如何“版本”在Linux平台上的C二进制文件
- 28. 如何将文本和二进制文件存储在hsqldb数据库中?
- 29. 将二进制信息保存到文件
- 30. 将linux二进制文件上传到maven仓库
[文件版本信息]的可能的重复(http://stackoverflow.com/questions/2296101/file-version-information) – 2010-07-23 01:45:59