2010-07-23 35 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在你的對象的先決條件列表中列出了這個,那麼構建將重新編譯它需要的東西。

相關問題