2013-05-02 55 views

回答

6

您可以將版本信息發送到文本文件中,然後將該文本文件轉換爲目標文件,然後將其靜態鏈接到可執行文件中。

第一步很簡單,但您必須編寫一些代碼:腳本或其他東西,以任何您喜歡的格式編寫您的版本信息作爲純文本文件。然後編寫一個makefile規則,使用objcopy從version.txt生成版本version.o。現在您將擁有一個包含兩個有用符號的對象文件:文本版本信息的開始和結束。將生成的對象添加到可執行文件中,然後可以通過兩種方式訪問​​版本:通過在二進制文件上運行strings,或者在應用程序中編寫代碼以打印版本字符串(您需要聲明開始和結束符號作爲某些頭文件中的變量)。

+4

謝謝。我發現用objcopy有更好的方法:objcopy --add-section versection = version_text main main_version。通過「objdump -s -j versection main_version」,可以檢索版本。 – Lane 2013-05-03 06:36:22

+1

嗨,約翰,我看到你是活躍的成員,即使這個答案是舊的。你是否想用一些非常基本的/簡單的例子來更新它,如何將文本文件編譯成對象?說「版本1.1.1」或什麼的。這就是我要做的問題,而且,這將是一個(更多/更少)「重複」... – 2015-07-11 03:35:14

+1

@DrBeco:在Linux上,您可以使用'objcopy'和顯式指定的'--input binary'和'--output'格式。這裏有一個完整的教程:http://www.linuxjournal.com/content/embedding-file-executable-aka-hello-world-version-5967。你也可以使用'ld'來選擇一些選項,我認爲''-b'可以做同樣的事情,或許更容易取決於你的確切場景。 – 2015-08-05 10:54:41

6

如果你不介意改變你的源文件只需一次,加上這樣的事情:

const volatile static char version[] = VERSION; 

和編譯:

gcc -c -DVERSION='"1.2.3"' 

volatile保持GCC從更高的去除串優化級別。

正如所寫的,如果您忘記了-D選項,這將不會編譯,根據您的要求,這可能是好的或壞的選項。

4

即使你沒有訪問源了,你可以用這個選項鍊接對象:

gcc -Wl,--defsym,VERSION_1_2_3=0 prog.o -o prog 

你可以用hexdump -C prog | less檢查,查找VERSION


將其添加到makefile並確保始終知道程序編譯時間:

BUILD = $(shell date +"%Y%m%d_%H%M%S") 
LDLIBS = -Wl,--defsym,BUILD_$(BUILD)=0 
相關問題