2017-08-04 223 views
0

我正在Linux上爲某些嵌入式設備構建Qt/C +應用程序,我想從二進制ELF文件中讀取應用程序的版本。二進制文件不會被剝離並用GCC編譯。如何從二進制文件中獲取應用程序的版本號?

有沒有辦法建立一個可執行文件,可以簡單地讀取其他程序來獲取應用程序的版本?

謝謝。

+0

[ELFIO - 用於讀取和生成ELF文件的C++庫](http://elfio.sourceforge.net/) –

+2

每個應用程序開發人員在應用程序二進制文件中都有不同的應用程序版本記錄方式,因此它可能很長用於讀取所有在ELF文件中查找版本信息的字符串或數字的二進制文件。 – AmeyaVS

回答

0

一些Qt應用程序顯示版本,如果你用命令行參數--version運行它,例如

$ kate --version 
kate 15.12.3 
1

有沒有建立一個可以通過其他一些程序能夠簡單地讀取一個可執行文件的方式獲取應用程序的版本?

可以這樣做嗎?絕對!

應該這樣做嗎?可能不會。

其中一種更簡單的方法是:將應用程序版本放入文本字​​符串中,並使用__attribute__((section("my_app_version")))在您選擇的特殊部分中找到該字符串。 Documentation

注意到readelf -x.my_app_version可以提取這個字符串。

現在您只需複製readelf所做的事情即可:讀取ELF文件標題以查找部分,然後閱讀相應部分。這將需要大量的代碼,技術人員可以在幾個小時內完成,或者如果願意使用幫助程序庫(例如libelf),則可以更快。

那麼,爲什麼你不應該這樣做呢?

由於您正在構建嵌入式系統,因此您可能會在某個時候創建​​文件系統映像以閃存到設備中。

在創建文件系統的最後一步之前,將一個文本文件放入其中,其中包含所有相關的版本信息。例如,如果你是把app1app2成圖像,你可以做這樣的事情:

VERSIONS=/tmp/rootfs/etc/VERSIONS 
rm -f $VERSIONS 
echo BuiltBy=$(whoami)@$(hostname) >> $VERSIONS 
echo BuiltOn=$(date) >> $VERSIONS 
echo App1=$(/tmp/build/bin/app1 --version) >> $VERSIONS 
echo App2=$(/tmp/build/bin/app2 --version) >> $VERSIONS 

現在的設備上運行的任何程序都可以平凡找到合適的版本信息,而不必從二進制提取它。

+0

有趣,感謝分享。事實上,我在某個時候創建​​了一個fs,我試圖減少與軟件管理相關的額外腳本或文件的數量,特別是如果這些數據可以直接從二進制文件中提取。 – Scab

+0

@Scab「減少額外的腳本」只有在降低總體複雜性時纔有意義。添加可以在運行時崩潰的不重要數量的C代碼,以移除無法失敗的普通shell腳本是沒有意義的。 –

相關問題