在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. 在linux中使用共享庫執行二進制文件
- 4. 告訴Linux二進制文件加載共享庫
- 5. Linux獨立於共享庫的二進制文件
- 6. 如何控制Linux上的共享庫版本問題?
- 7. 在構建的二進制文件中更改版本信息
- 8. 在iPhone和iPad之間共享NSUserDefaults通用二進制文件版本
- 9. 在Android中共享二進制文件
- 10. 同一個Linux發行版的不同版本之間的二進制和共享庫兼容性
- 11. 如何檢索二進制文件的二進制版本號
- 12. 將外部SDK二進制文件共享到WPF和Silverlight
- 13. 獲取二進制文件和文本信息
- 14. 在.Net中讀取文本和二進制信息的文件
- 15. 編譯後的Linux共享庫(.so文件)版本
- 16. 版本控制共享文件夾
- 17. Capistrano:共享文件的版本控制/
- 18. 如何嵌入版本信息使用mercurial和maven(和svn)
- 19. 如何將共享庫與其他共享庫鏈接到Linux?
- 20. 相同二進制文件中的可執行文件和DLL /共享庫
- 21. 複製本地共享文件,將Linux本地驅動器
- 22. 共享庫:沒有可用的版本信息
- 23. 擁有版本信息的CMAKE鏈接共享庫
- 24. 由於缺少共享庫,二進制文件拒絕運行
- 25. 更新二進制文件信息
- 26. 涉及二進制和文本文件時的版本控制?
- 27. 如何將字符串嵌入到二進制文件中?
- 28. gdb模糊共享庫事件信息
- 29. 共享信息
- 30. Linux共享庫
[文件版本信息]的可能的重複(http://stackoverflow.com/questions/2296101/file-version-information) – 2010-07-23 01:45:59